Как сделать PDF файл загружаемым в HTML-ссылку?
Я даю ссылку на файл pdf на моей веб-странице для загрузки, например ниже
<a href="myfile.pdf">Download Brochure</a>
Проблема заключается в том, что пользователь нажимает на эту ссылку, затем
- Если пользователь установил Adobe Acrobat, он открывает файл в том же окне браузера в Adobe Reader.
- Если Adobe Acrobat не установлен, он открывается пользователю для загрузки файла.
Но я хочу, чтобы он всегда загружался пользователю для загрузки, независимо от того, установлен ли "Adobe acrobat" или нет.
Скажите, пожалуйста, как я могу это сделать?
Ответы
Ответ 1
Вместо того, чтобы ссылаться на файл .PDF, вместо этого сделайте что-то вроде
<a href="pdf_server.php?file=pdffilename">Download my eBook</a>
который выводит пользовательский заголовок, открывает PDF (двоичный сейф) и печатает данные в пользовательском браузере, тогда они могут выбрать сохранение 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 к значению
Ответ 2
Это обычная проблема, но мало кто знает о простом решении 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-несовместимыми или устаревшими браузерами. Единственный браузер, который я тестировал, который не принудительно загружал, - это IE...
Проверьте совместимость здесь: http://caniuse.com/#feat=download
Ответ 3
Не выполняйте цикл через каждую строку файла.
Используйте 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 файлы...
Ответ 4
Вместо использования PHP script для чтения и очистки файла более аккуратно переписать заголовок с помощью .htaccess
. Это сохранит "хороший" URL (myfile.pdf
вместо download.php?myfile
).
<FilesMatch "\.pdf$">
ForceType applicaton/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
Ответ 5
Я нашел способ сделать это с помощью простого старого 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()
, чтобы открыть новое окно с файлом.
Ответ 6
Это ключ:
header("Content-Type: application/octet-stream");
При отправке PDF файла отправляется приложение типа контента/x-pdf-документ или приложение /pdf. Adobe Reader обычно устанавливает обработчик для этого типа MIME, чтобы браузер передавал документ Adobe Reader, когда был получен какой-либо из PDF MIME-типов.
Ответ 7
В HTML5 есть более простой способ: Добавить атрибут Download
.
Он поддерживается большинством современных браузеров.
<a download href="file.pdf">Download PDF</a>
Ответ 8
Я знаю, что очень поздно ответить на это, но я нашел взломать это в javascript.
function downloadFile(src){
var link=document.createElement('a');
document.body.appendChild(link);
link.href= src;
link.download = '';
link.click();
}
Ответ 9
Это обычная проблема, но мало кто знает о простом решении HTML 5:
<a href="./directory/yourfile.pdf" download="filename">Download the pdf</a>
}
Ответ 10
Попробуйте следующее:
<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);
Ответ 11
Здесь другой подход. Я предпочитаю, а не полагаться на поддержку браузера или адресовать это на уровне приложения, чтобы использовать логику веб-сервера.
Если вы используете Apache и можете поместить файл .htaccess в соответствующий каталог, вы можете использовать приведенный ниже код. Конечно, вы можете поместить это в httpd.conf, если у вас есть к этому доступ.
<FilesMatch "\.(?i:pdf)$">
Header set Content-Disposition attachment
</FilesMatch>
Директива FilesMatch - это просто регулярное выражение, поэтому его можно установить так же подробно, как вы хотите, или добавить другие расширения.
Строка заголовка делает то же самое, что и первая строка в скриптах PHP выше. Если вам нужно также установить строки Content-Type, вы можете сделать это таким же образом, но я не нашел нужным.
Ответ 12
Я решил использовать весь URL-адрес файла PDF (вместо того, чтобы просто поместить имя файла или его местоположение в href): a href= "domain. com/pdf/filename.pdf"
Ответ 13
если вам нужно ограничить скорость загрузки, используйте этот код !!
<?php
$local_file = 'file.zip';
$download_file = 'name.zip';
// set the download rate limit (=> 20,5 kb/s)
$download_rate = 20.5;
if(file_exists($local_file) && is_file($local_file))
{
header('Cache-control: private');
header('Content-Type: application/octet-stream');
header('Content-Length: '.filesize($local_file));
header('Content-Disposition: filename='.$download_file);
flush();
$file = fopen($local_file, "r");
while(!feof($file))
{
// send the current file part to the browser
print fread($file, round($download_rate * 1024));
// flush the content to the browser
flush();
// sleep one second
sleep(1);
}
fclose($file);}
else {
die('Error: The file '.$local_file.' does not exist!');
}
?>
Для получения дополнительной информации нажмите здесь
Ответ 14
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>File Uploader</title>
<script src="../Script/angular1.3.8.js"></script>
<script src="../Script/angular-route.js"></script>
<script src="../UserScript/MyApp.js"></script>
<script src="../UserScript/FileUploder.js"></script>
<>
.percent {
position: absolute;
width: 300px;
height: 14px;
z-index: 1;
text-align: center;
font-size: 0.8em;
color: white;
}
.progress-bar {
width: 300px;
height: 14px;
border-radius: 10px;
border: 1px solid #CCC;
background-image: -webkit-gradient(linear, left top, left bottom, from(#6666cc), to(#4b4b95));
border-image: initial;
}
.uploaded {
padding: 0;
height: 14px;
border-radius: 10px;
background-image: -webkit-gradient(linear, left top, left bottom, from(#66cc00), to(#4b9500));
border-image: initial;
}
</>
</head>
<body ng-app="MyApp" ng-controller="FileUploder">
<div>
<table ="width:100%;border:solid;">
<tr>
<td>Select File</td>
<td>
<input type="file" ng-model-instant id="fileToUpload" onchange="angular.element(this).scope().setFiles(this)" />
</td>
</tr>
<tr>
<td>File Size</td>
<td>
<div ng-repeat="file in files.slice(0)">
<span ng-switch="file.size > 1024*1024">
<span ng-switch-when="true">{{file.size / 1024 / 1024 | number:2}} MB</span>
<span ng-switch-default>{{file.size / 1024 | number:2}} kB</span>
</span>
</div>
</td>
</tr>
<tr>
<td>
File Attach Status
</td>
<td>{{AttachStatus}}</td>
</tr>
<tr>
<td>
<input type="button" value="Upload" ng-click="fnUpload();" />
</td>
<td>
<input type="button" value="DownLoad" ng-click="fnDownLoad();" />
</td>
</tr>
</table>
</div>
</body>
</html>
Ответ 15
В приложении Ruby on Rails (особенно с чем-то вроде драгоценности "Креветка" и плагином Prawnto Rails) вы можете сделать это немного проще, чем полный на script (как и предыдущий пример 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