Handles local aliases (redirection) for file uploads attached to notices.

This commit is contained in:
Robin Millette 2009-05-27 03:47:45 -04:00
parent 37423b12d7
commit ed1e1d9f44
6 changed files with 62 additions and 8 deletions

6
.gitignore vendored
View File

@ -1,5 +1,6 @@
avatar/* avatar/*
files/* files/*
file/*
_darcs/* _darcs/*
logs/* logs/*
config.php config.php
@ -16,3 +17,8 @@ dataobject.ini
.buildpath .buildpath
.project .project
.settings .settings
TODO.rym
config-*.php
good-config.php
lac08.log
php.log

40
actions/file.php Normal file
View File

@ -0,0 +1,40 @@
<?php
/*
* Laconica - a distributed open-source microblogging tool
* Copyright (C) 2008, Controlez-Vous, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
if (!defined('LACONICA')) { exit(1); }
require_once(INSTALLDIR.'/actions/shownotice.php');
class FileAction extends ShowNoticeAction
{
function showPage() {
$source_url = common_local_url('file', array('notice' => $this->notice->id));
$query = "select file_redirection.url as url from file join file_redirection on file.id = file_redirection.file_id where file.url = '$source_url'";
$file = new File_redirection;
$file->query($query);
$file->fetch();
if (empty($file->url)) {
die('nothing attached here');
} else {
header("Location: {$file->url}");
die();
}
}
}

View File

@ -110,7 +110,7 @@ class NewnoticeAction extends Action
} }
function isFileAttached() { function isFileAttached() {
return $_FILES['attach']['error'] === UPLOAD_ERR_OK; return isset($_FILES['attach']['error']) && ($_FILES['attach']['error'] === UPLOAD_ERR_OK);
} }
/** /**
@ -205,14 +205,19 @@ class NewnoticeAction extends Action
$destination = "file/{$notice->id}-$filename"; $destination = "file/{$notice->id}-$filename";
if (move_uploaded_file($_FILES['attach']['tmp_name'], INSTALLDIR . "/$destination")) { if (move_uploaded_file($_FILES['attach']['tmp_name'], INSTALLDIR . "/$destination")) {
$file = new File; $file = new File;
// $file->url = common_local_url('file', array('notice' => $notice->id)); $file->url = common_local_url('file', array('notice' => $notice->id));
$file->url = common_path($destination); // $file->url = common_path($destination);
$file->size = filesize(INSTALLDIR . "/$destination"); $file->size = filesize(INSTALLDIR . "/$destination");
$file->date = time(); $file->date = time();
$file->mimetype = $_FILES['attach']['type']; $file->mimetype = $_FILES['attach']['type'];
if ($ok = $file->insert()) { if ($file_id = $file->insert()) {
$file_redir = new File_redirection;
$file_redir->url = common_path($destination);
$file_redir->file_id = $file_id;
$file_redir->insert();
$f2p = new File_to_post; $f2p = new File_to_post;
$f2p->file_id = $ok; $f2p->file_id = $file_id;
$f2p->post_id = $notice->id; $f2p->post_id = $notice->id;
$f2p->insert(); $f2p->insert();
} else { } else {

View File

@ -133,7 +133,7 @@ class File_redirection extends Memcached_DataObject
$file->limit(1); $file->limit(1);
$file->orderBy('len'); $file->orderBy('len');
$file->find(true); $file->find(true);
if (!empty($file->id)) { if (!empty($file->url) && (strlen($file->url) < strlen($long_url))) {
return $file->url; return $file->url;
} }

View File

@ -164,11 +164,9 @@ class Router
array('action' => 'newnotice'), array('action' => 'newnotice'),
array('replyto' => '[A-Za-z0-9_-]+')); array('replyto' => '[A-Za-z0-9_-]+'));
/*
$m->connect('notice/:notice/file', $m->connect('notice/:notice/file',
array('action' => 'file'), array('action' => 'file'),
array('notice' => '[0-9]+')); array('notice' => '[0-9]+'));
*/
$m->connect('notice/:notice', $m->connect('notice/:notice',
array('action' => 'shownotice'), array('action' => 'shownotice'),

View File

@ -499,6 +499,11 @@ function common_linkify($url) {
// if this URL is an attachment, then we set class='attachment' and id='attahcment-ID' // if this URL is an attachment, then we set class='attachment' and id='attahcment-ID'
// where ID is the id of the attachment for the given URL. // where ID is the id of the attachment for the given URL.
//
// we need a better test telling what can be shown as an attachment
// we're currently picking up oembeds only.
// I think the best option is another file_view table in the db
// and associated dbobject.
$query = "select file_oembed.file_id as file_id from file join file_oembed on file.id = file_oembed.file_id where file.url='$longurl'"; $query = "select file_oembed.file_id as file_id from file join file_oembed on file.id = file_oembed.file_id where file.url='$longurl'";
$file = new File; $file = new File;
$file->query($query); $file->query($query);