"имя" веб-PDF для лучшего сохранения файла по умолчанию в Acrobat - PullRequest
42 голосов
/ 30 сентября 2008

Мое приложение генерирует PDF-файлы для использования пользователем. HTTP-заголовок "Content-Disposition" установлен так, как указано здесь . Для него установлено значение «inline; filename = foo.pdf», которого должно быть достаточно для того, чтобы Acrobat предоставил «foo.pdf» в качестве имени файла при сохранении pdf.

Однако после нажатия кнопки «Сохранить» во встроенном в браузер Acrobat именем по умолчанию для сохранения будет не это имя файла, а URL-адрес с косой чертой, измененный на подчеркивание. Огромный и безобразный. Есть ли способ повлиять на это имя файла по умолчанию в Adobe?

В URL есть строка запроса, и это не подлежит обсуждению. Это может быть важно, но добавление «& foo = / title.pdf» в конец URL не влияет на имя файла по умолчанию.

Обновление 2: я пробовал оба

content-disposition  inline; filename=foo.pdf
Content-Type         application/pdf; filename=foo.pdf

и

content-disposition  inline; filename=foo.pdf
Content-Type         application/pdf; name=foo.pdf

(подтверждено через Firebug) К сожалению, ни один из них не работал.

Пример URL-адреса

/bar/sessions/958d8a22-0/views/1493881172/export?format=application/pdf&no-attachment=true

, что соответствует сохранению Acrobat по умолчанию в качестве имени файла

http___localhost_bar_sessions_958d8a22-0_views_1493881172_export_format=application_pdf&no-attachment=true.pdf

Обновление 3: Джулиан Решке привносит реальное понимание и строгость в этот случай. Пожалуйста, подтвердите его ответ. Похоже, что это не работает в FF (https://bugzilla.mozilla.org/show_bug.cgi?id=433613) и IE, но работает в Opera, Safari и Chrome. http://greenbytes.de/tech/tc2231/#inlwithasciifilenamepdf

Ответы [ 16 ]

0 голосов
/ 12 июля 2018

Кредиты Вивек .


Nginx

location /file.pdf
{
    # more_set_headers "Content-Type: application/pdf; name=save_as_file.pdf";
    add_header Content-Disposition "inline; filename=save_as_file.pdf";
    alias /var/www/file.pdf;
}

Проверить с помощью

curl -I https://example.com/file.pdf

Firefox 62.0b5 (64-разрядная версия): ОК.

Chrome 67.0.3396.99 (64-разрядная версия): ОК.

IE 11: без комментариев.

0 голосов
/ 06 января 2010

Для тех, кто все еще смотрит на это, я использовал найденное решение здесь , и оно работало чудесно. Спасибо Фабрицио!

0 голосов
/ 26 ноября 2009

Я решил это (с помощью PHP) следующим образом:

Предположим, ваш URL-адрес SomeScript.php?id=ID&data=DATA и файл, который вы хотите использовать, TEST.pdf.

Изменить URL-адрес на SomeScript.php/id/ID/data/DATA/EXT/TEST.pdf.

Важно, чтобы последним параметром было имя файла, которое вы хотите использовать в Adobe («EXT» может быть любым). Убедитесь, что в указанной выше строке нет специальных символов, кстати.

Теперь, наверху SomeScript.php, добавьте:

$_REQUEST = MakeFriendlyURI( $_SERVER['PHP\_SELF'], $_SERVER['SCRIPT_FILENAME']);

Затем добавьте эту функцию в SomeScript.php (или вашу библиотеку функций):

function MakeFriendlyURI($URI, $ScriptName) {

/* Need to remove everything up to the script name */
$MyName = '/^.*'.preg_quote(basename($ScriptName)."/", '/').'/';
$Str = preg_replace($MyName,'',$URI);
$RequestArray = array();

/* Breaks down like this
      0      1     2     3     4     5
    PARAM1/VAL1/PARAM2/VAL2/PARAM3/VAL3
*/

$tmp = explode('/',$Str);   
/* Ok so build an associative array with Key->value
   This way it can be returned back to $_REQUEST or $_GET
 */
for ($i=0;$i < count($tmp); $i = $i+2){
    $RequestArray[$tmp[$i]] = $tmp[$i+1];
}
return $RequestArray;       
}//EO MakeFriendlyURI

Теперь $_REQUEST (или $_GET, если вы предпочитаете) доступен как обычно $_REQUEST['id'], $_REQUEST['data'] и т. Д.

И Adobe будет использовать желаемое имя файла в качестве файла сохранения по умолчанию или информации электронной почты, когда вы отправите его в строке.

0 голосов
/ 07 апреля 2009

Попробуйте, если ваш исполняемый файл "get.cgi"

http://server,org/get.cgi/filename.pdf?file=filename.pdf

Да, это совершенно безумно. На сервере нет файла с именем filename.pdf, вообще есть каталог под исполняемым файлом get.cgi.

Но, похоже, работает. Сервер игнорирует имя файла .pdf, а программа чтения PDF игнорирует «get.cgi»

Dan

0 голосов
/ 14 января 2009

Я был перенаправлен сюда, потому что у меня та же проблема. Я также попробовал обходной путь Троя Ховарда, но, похоже, он не работает.

Подход, который я применил к этому, заключается в том, чтобы НИКОГДА не использовать объект ответа для записи файла на лету. Поскольку файл PDF уже существует на сервере, я перенаправил свою страницу, указывающую на этот файл PDF. Прекрасно работает.

http://forums.asp.net/t/143631.aspx

Надеюсь, мое смутное объяснение дало вам представление.

0 голосов
/ 30 сентября 2008

Вы всегда можете иметь две ссылки. Один открывает документ в браузере, другой загружает его (используя неверный тип содержимого). Это то, что делает Gmail.

...