Переименовать PDF-файл для загрузки на лету - PullRequest
4 голосов
/ 01 декабря 2009

Дано: Все загруженные на сервер pdf-файлы имеют префикс времени. Позже пользователь может загрузить эти файлы снова. Эти (некрасивые) имена файлов никогда не изменятся на сервере.

Вопрос: Когда я даю возможность скачать файл PDF, имя файла выглядит некрасиво и долго. Как я могу изменить это имя на что-то разумное, чтобы, когда пользователь загружает этот файл, имя не выглядело странно?

Нужно ли делать копию, поскольку переименовать исходный файл нельзя? Разве это не было бы лишними затратами для каждого загружаемого файла? Очевидно, что удаление скопированного файла было бы еще одним дополнительным шагом?

Можно ли переименовать файл после полной загрузки файла на стороне клиента?

Что вы, ребята, предлагаете?

Ответы [ 5 ]

9 голосов
/ 01 декабря 2009

Примерно так:

<?php
// We'll be outputting a PDF  
header('Content-type: application/pdf');

// It will be called downloaded.pdf  
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// The PDF source is in original.pdf  
readfile('original.pdf');
?> 
5 голосов
/ 04 октября 2012

Мне нужно было сделать это для недавнего проекта, и я был немного озадачен тем, как его реализовать, но понял это вскоре после ответа Клауса. Для дальнейшего уточнения ответа Клауса:

1) Создайте файл с именем, скажем, «process.php». Измените код Клауса так, чтобы он принимал два параметра: исходное имя файла и новое имя. Мой process.php выглядит так:

<?php
$file = $_GET['file'];
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/pdf');
    header('Content-Disposition: attachment; filename='.$_GET['newFile']);
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>

2) Создайте ссылку на своей пользовательской странице, которая указывает на скрипт процессора:

<a href="process.php?file=OriginalFile.pdf&newFile=MyRenamedFile.pdf">DOWNLOAD ME</a>
1 голос
/ 01 декабря 2009

Вам необходимо установить желаемое имя файла в заголовке Content-Disposition:

$name = 'desiredname.pdf';
header('Content-Disposition: attachment;filename="' . $name . '"');

Но, к сожалению, это не подхватит некий веб-браузер, разработанный командой в Редмонде. Если вы хотите, чтобы он также работал в этом браузере, вам нужно добавить то же имя файла, что и в последней части пути запроса. Например: http://example.com/pdf/desiredname.pdf.

0 голосов
/ 01 декабря 2009

Некоторое время назад я делал что-то похожее, обслуживая файлы через php (в моем случае не для их переименования, а для проверки того, что загрузивший их человек вошел в систему и ему было разрешено просматривать эти файлы). Я обнаружил, что загрузка PDF не работает в IE, если я не добавил эти заголовки:

header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Transfer-Encoding: binary');

Я не уверен почему. Поэкспериментируйте и посмотрите, что получится.

0 голосов
/ 01 декабря 2009

Имя файла обслуживаемого контента определяется в заголовках HTTP. Просмотрите страницу PHP на заголовках (также комментарии) для получения дополнительной информации.

...