Как сделать PDF файл загружаемым в HTML ссылку?



Я даю ссылку на pdf-файл на моей веб-странице для загрузки, как показано ниже



<a href="myfile.pdf">Download Brochure</a>


проблема, когда пользователь нажимает на эту ссылку, то




  • если пользователь установил Adobe Acrobat, то он открывает файл в том же окне браузера в Adobe Reader.

  • если Adobe Acrobat не установлен, то он всплывает к пользователю для загрузки файла.


но я хочу, чтобы он всегда всплывал к пользователю для загрузки, независимо от "Adobe acrobat" установлен или нет.



Пожалуйста, скажите мне, как я могу это сделать?

3193   12  

12 ответов:

вместо ссылки на .PDF файл, вместо этого сделать что-то вроде

<a href="pdf_server.php?file=pdffilename">Download my eBook</a>

который выводит пользовательский заголовок, открывает PDF (binary safe) и печатает данные в браузере пользователя, а затем они могут выбрать, чтобы сохранить PDF, несмотря на их настройки браузера. В pdf_server.PHP должен выглядеть так:

header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
header("Content-Disposition: attachment; filename=" . urlencode($file));   
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp); 

PS: и, очевидно, запустить некоторые проверки здравомыслия на переменную "файл", чтобы предотвратить людей от кражи файлов, таких как не принимать расширения файлов, запретить косые черты, добавить .pdf к значению

Это распространенная проблема, но мало кто знает, что есть простое решение HTML 5:

<a href="./directory/yourfile.pdf" download="newfilename">Download the pdf</a>

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

<a href="./directory/yourfile.pdf" download>Download the pdf</a>

совместимость: я тестировал это на Firefox 21 и Iron, оба работали нормально. Он может не работать в HTML5-несовместимых или устаревших браузерах. Единственный браузер, который я тестировал, который не заставлял загружать, - это ТО ЕСТЬ...

проверьте совместимость здесь:http://caniuse.com/#feat=download

Не петли через каждую строку файла. Используйте readfile вместо этого, его быстрее. Это вне сайта php: http://php.net/manual/en/function.readfile.php

$file = $_GET["file"];
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header("Content-Type: application/force-download");
    header('Content-Disposition: attachment; filename=' . urlencode(basename($file)));
    // header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}

убедитесь, что вы очистили свою переменную get, так как кто-то может загрузить некоторые файлы php...

вместо того, чтобы использовать php-скрипт, чтобы прочитать и очистить файл, более аккуратно переписать заголовок с помощью .htaccess. Это позволит сохранить" хороший " URL (myfile.pdf вместо download.php?myfile).

<FilesMatch "\.pdf$">
ForceType applicaton/octet-stream
Header set Content-Disposition attachment
</FilesMatch>

Я нашел способ сделать это с помощью простого старого HTML и JavaScript/jQuery, который изящно деградирует. Протестировано в IE7-10, Safari, Chrome и FF:

HTML для ссылки на скачивание:

<p>Thanks for downloading! If your download doesn't start shortly, 
<a id="downloadLink" href="...yourpdf.pdf" target="_blank" 
type="application/octet-stream" download="yourpdf.pdf">click here</a>.</p>

jQuery (чистый код JavaScript был бы более подробным), который имитирует нажатие на ссылку после небольшой задержки:

var delay = 3000;
window.setTimeout(function(){$('#downloadLink')[0].click();},delay);

чтобы сделать это более надежным, вы можете добавить обнаружение функций HTML5, и если его там нет, используйте window.open() открыть новое окно с файлом.

это ключ:

header("Content-Type: application/octet-stream");

Content-type application/x-pdf-документ или приложение / pdf отправляется при отправке PDF-файла. Adobe Reader обычно устанавливает обработчик для этого типа MIME, поэтому браузер будет передавать документ в Adobe Reader при получении любого из типов PDF MIME.

в HTML5 есть более простой способ: добавить

Я знаю, что я очень поздно, чтобы ответить на этот вопрос, но я нашел хак, чтобы сделать это в javascript.

function downloadFile(src){
    var link=document.createElement('a');
    document.body.appendChild(link);
    link.href= src;
    link.download = '';
    link.click();
}

попробуйте это:

<a href="pdf_server_with_path.php?file=pdffilename&path=http://myurl.com/mypath/">Download my eBook</a>

код внутри pdf_server_with_path.php это:

header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
$path = $_GET["path"];
$fullfile = $path.$file;

header("Content-Disposition: attachment; filename=" . Urlencode($file));   
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . Filesize($fullfile));
flush(); // this doesn't really matter.
$fp = fopen($fullfile, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp);

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

Если вы используете Apache, и может положить .файл htaccess в соответствующем каталоге вы можете использовать приведенный ниже код. Конечно, вы можете поместить это в httpd.conf также, если у вас есть доступ к этому.

<FilesMatch "\.(?i:pdf)$">
  Header set Content-Disposition attachment
</FilesMatch>

директива FilesMatch-это просто регулярное выражение, поэтому ее можно установить так же подробно, как вы хотите, или вы можете добавить другие добавочные номера.

строка заголовка делает то же самое, что и первая строка в скриптах PHP выше. Если вам также нужно установить строки типа контента, вы можете сделать это таким же образом, но я не нашел это необходимым.

Я решил мой, используя весь url-адрес PDF-файла (вместо того, чтобы просто поместить имя файла или местоположение в href): a href="домен . com / pdf / filename.PDF-файл"

в приложении Ruby on Rails (особенно с чем-то вроде Prawn gem и плагина Prawnto Rails) вы можете выполнить это немного проще, чем полный сценарий (например, предыдущий пример PHP).

в вашем контроллере:

def index

 respond_to do |format|
   format.html # Your HTML view
   format.pdf { render :layout => false }
 end
end

render: layout = > false часть говорит браузеру, чтобы открыть "Вы хотели бы загрузить этот файл?"запрос вместо того, чтобы пытаться отобразить PDF. Тогда вы сможете нормально ссылаться на файл: http://mysite.com/myawesomepdf.pdf

Comments

    Ничего не найдено.