как сделать pdf файл можно скачать по ссылке html?

<p>я даю ссылку на файл pdf на моей веб-странице для скачивания, как показано ниже</p><pre><code><a href="myfile.pdf">download brochure</a> </code></pre><p>проблема в том, что когда пользователь нажимает на эту ссылку,</p><ul> <li>если пользователь установил adobe acrobat, он открывает файл в том же окне браузера в adobe reader.</li> <li>если adobe acrobat не установлен, он выскакивает пользователю для загрузки файла.</li> </ul><p>но я хочу, чтобы он всегда всплывал для загрузки пользователем, независимо от того, установлен adobe acrobat или нет.</p><p>пожалуйста, скажите мне, как я могу это сделать?</p>

<p>вместо ссылки на файл .pdf вместо этого сделайте что-то вроде </p><pre><code><a href="pdf\_server.php?file=pdffilename">download my ebook</a> </code></pre><p>который выводит пользовательский заголовок, открывает pdf (бинарный сейф) и печатает данные в браузере пользователя, затем они могут выбрать сохранение pdf, несмотря на настройки браузера. файл pdf\_server.php должен выглядеть следующим образом:</p><pre><code>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: и, очевидно, запустить некоторые проверки работоспособности для переменной «file», чтобы предотвратить кражу ваших файлов, например, не принимать расширения файлов, запрещать слеш, добавлять .pdf к значению

это распространенная проблема, но мало кто знает, что существует простое решение html 5:<a href="./directory/yourfile.pdf" download="newfilename">download the pdf где newfilename - это предложенное имя файла для сохранения файла пользователем. или это будет по умолчанию имя файла на стороне сервера, если вы оставите его пустым, например так:<a href="./directory/yourfile.pdf" download>download the pdf совместимость: я проверял это на firefox 21 и iron, оба работали нормально. это может не работать в html5-несовместимых или устаревших браузерах. единственный браузер, который я тестировал, который не вызывал загрузку, это ie ...проверьте совместимость здесь: <a href="http://caniuse.com/#feat=download">http://caniuse.com/#feat=download 

<strong>не зацикливайте</strong> на каждой строке файла . вместо этого используйте <strong>readfile</strong>, это быстрее. это с сайта php: <a href="http://php.net/manual/en/function.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> </code></pre>

<p>в html5 есть более простой способ: добавить атрибут <code>download</code>. </p><p>это поддерживается большинством современных браузеров.</p><pre><code><a download href="file.pdf">download pdf</a> </code></pre>

<p>это ключ:</p><pre><code>header("content-type: application/octet-stream"); </code></pre><p>приложение типа контента/x-pdf-document или application/pdf отправляется при отправке файла pdf. adobe reader обычно устанавливает обработчик для этого типа mime, поэтому браузер передает документ в adobe reader при получении любого из pdf типов mime.</p>

<p>попробуй это:</p><p><code><a href="pdf\_server\_with\_path.php?file=pdffilename&path=http://myurl.com/mypath/">download my ebook</a></code></p><p>код внутри pdf\_server\_with\_path.php:</p><pre><code>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); </code></pre>

<p>если вам нужно ограничить скорость загрузки, используйте этот код !!</p><pre><code><?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!'); } ?> </code></pre><p>для получения дополнительной информации <a href="http://php.net/manual/en/function.readfile.php">нажмите здесь</a> </p>

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

<pre><code><!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> </code></pre>

<p>вот другой подход. я предпочитаю вместо того, чтобы полагаться на поддержку браузера или обращаться к ней на уровне приложений, чтобы использовать логику веб-сервера.</p><p>если вы используете apache и можете поместить файл .htaccess в соответствующий каталог, вы можете использовать приведенный ниже код. конечно, вы также можете поместить это в httpd.conf, если у вас есть доступ к этому.</p><pre><code><filesmatch "\.(?i:pdf)$"> header set content-disposition attachment </filesmatch> </code></pre><p>директива filesmatch - это просто регулярное выражение, поэтому его можно установить настолько детально, как вы хотите, или вы можете добавить другие расширения.</p><p>строка header делает то же самое, что и первая строка в скриптах php выше. если вам нужно также установить строки content-type, вы можете сделать это таким же образом, но я не нашел в этом необходимости.</p>