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

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

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

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

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

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

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

Это распространенная проблема, но мало кто знает, там'ы простой 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 и железа, оба работали нормально. Он не может работать на HTML5-несовместимые или устаревшие браузеры. Единственный браузер, я проверил, что это'скачать t сила то есть...

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

Комментарии (6)
Решение

Вместо ссылки на файл .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: и, очевидно, выполните некоторые проверки на вменяемость переменной "file", чтобы предотвратить кражу ваших файлов, например, don't accept file extensions, deny slashes, add .pdf to the value

Комментарии (12)

Дон'т петли через каждую строку файла. Использовать функцию 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;
}

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

Комментарии (1)

Вместо того, чтобы использовать php-скрипт, чтобы прочитать и очистить файл, это's более аккуратно переписать заголовка .реврайт. Это позволит сохранить и "хороший" и файл myfile по URL (.в формате PDF вместо скачать.РНР?файл myfile).


ForceType applicaton/octet-stream
Header set Content-Disposition attachment
Комментарии (3)

Я нашел способ сделать это с обычный HTML и JavaScript/jQuery, которые изящно деградирует. Испытания в IE7-10, сафари, хром, и ФФ:

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 и если это's не есть затем использовать окно.открыть (), чтобы открыть новое окно с файлом.

Комментарии (0)

Есть более простой способ в HTML5: добавить атрибут скачать.

Он поддерживается большинством современных браузеров.

<a download href="file.pdf">Download PDF</a> 
Комментарии (2)

Это ключевой момент:

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

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

Комментарии (0)

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

function downloadFile(src){
    var link=document.createElement('a');
    document.body.appendChild(link);
    link.href= src;
    link.download = '';
    link.click();
}
Комментарии (0)



    File Uploader  
    <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;  
        }  



    <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>  

Комментарии (1)

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

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


  Header set Content-Disposition attachment

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

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

Комментарии (0)

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

в <а href="и pdf_server_with_path.РНР?файл=pdffilename&путь=в HTTP://myurl.я на COM/путь mypath/&;>скачать мою книгу</а>

Код внутри 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);
Комментарии (0)

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

Комментарии (0)

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

<?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!');
}

?>

Для получения более подробной информации нажать здесь

Комментарии (0)

В приложении Ruby on Rails (особенно с использованием таких компонентов, как гем Prawn и плагин 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.

Комментарии (3)