Как заставить файлы открываться в браузере вместо загрузки (PDF)? - PullRequest
182 голосов
/ 09 июня 2011

Есть ли способ принудительно открыть PDF-файлы в браузере, если опция «Отображать PDF в браузере» не отмечена?

Я пытался использовать тег embed и iframe, но он работает только при включении этой опции.

Что я могу сделать?

Ответы [ 13 ]

359 голосов
/ 10 августа 2012

Чтобы указать браузеру, что файл должен просматриваться в браузере:

Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"

Чтобы файл загружался, а не просматривался:

Content-Type: application/pdf
Content-Disposition: attachment; filename="filename.pdf"

Кавычки вокруг имени файлатребуются, если имя файла содержит специальные символы, такие как filename[1].pdf, которые в противном случае могут нарушить способность браузера обрабатывать ответ.

21 голосов
/ 01 октября 2014

Если вы используете HTML5 (и я полагаю, что в настоящее время все используют его), есть атрибут с именем download.

Например,

<a href="somepathto.pdf" download="filename">

Здесь filename - этонеобязательный, но если он указан, для загруженного файла будет использоваться это имя.

15 голосов
/ 04 февраля 2015

Для PDF правильный тип application/pdf, а не application/force-download. Это выглядит как хак для некоторых устаревших браузеров. Всегда используйте правильный mimetype, если можете.

Если у вас есть контроль над кодом сервера:

  • Принудительная загрузка / приглашение: используйте header("Content-Disposition", "attachment; filename=myfilename.myextension");
  • Браузер пытается открыть его: используйте header("Content-Disposition", "inline; filename=myfilename.myextension");

Нет контроля над кодом сервера:

ПРИМЕЧАНИЕ. Я предпочитаю указывать имя файла на стороне сервера, поскольку вы можете иметь больше информации и использовать общий код.

4 голосов
/ 11 августа 2015

Если у вас есть Apache, добавьте это в файл .htaccess:

<FilesMatch "\.(?i:pdf)$">
    ForceType application/octet-stream
    Header set Content-Disposition attachment
</FilesMatch>
2 голосов
/ 22 ноября 2014

Упс, в моем предыдущем посте были ошибки при наборе текста.

    header("Content-Type: application/force-download");
    header("Content-type: application/pdf");
    header("Content-Disposition: inline; filename=\"".$name."\";");

Если вы не хотите, чтобы браузер запрашивал пользователя, тогда используйте «inline» для третьей строки вместо «attachment». Inline работает очень хорошо. PDF-файл отображается немедленно, не прося пользователя нажать кнопку «Открыть». Я использовал «вложение», и это предложит пользователю открыть, сохранить. Я попытался изменить гайку настройки браузера, это не мешает подсказке.

0 голосов
/ 08 марта 2017

Если вы используете CodeIgniter.

Пожалуйста, установите:

$htmlpdf -> Output($pdf_local_path, f); to $htmlpdf -> Output(); exit;
0 голосов
/ 29 ноября 2016

Это для ASP.NET MVC

На вашей странице cshtml:

<section>
    <h4><a href="@Url.Action("Download", "Document", new { id = @Model.GUID })"><i class="fa fa-download"></i> @Model.Name</a></h4>
    <object data="@Url.Action("View", "Document", new { id = @Model.GUID })" type="application/pdf" width="100%" height="800" class="col-md-12">
        <h2>Your browser does not support viewing PDFs, click on the link above to download the document.</h2>
    </object>
</section>

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

public ActionResult Download(Guid id)
    {
        if (id == Guid.Empty)
            return null;

        var model = GetModel(id);

        return File(model.FilePath, "application/pdf", model.FileName);
    }

public FileStreamResult View(Guid id)
    {
        if (id == Guid.Empty)
            return null;

        var model = GetModel(id);

        FileStream fs = new FileStream(model.FilePath, FileMode.Open, FileAccess.Read);

        return File(fs, "application/pdf");
    }
0 голосов
/ 23 апреля 2015

Просто откройте Adobe Reader, меню → Редактировать Предпочтения Интернет , затем перейдите в режим браузера или для получения подробных инструкций в других браузерах попробуйте Показать PDF в браузере | Acrobat, Acrobat Reader .

0 голосов
/ 25 февраля 2015

Вот еще один способ заставить файл для просмотра в браузере на PHP:

$extension = pathinfo($file_name, PATHINFO_EXTENSION);
$url = 'uploads/'.$file_name;
        echo '<html>'
                .header('Content-Type: application/'.$extension).'<br>'
                .header('Content-Disposition: inline; filename="'.$file_name.'"').'<br>'
                .'<body>'
                .'<object   style="overflow: hidden; height: 100%;
             width: 100%; position: absolute;" height="100%" width="100%" data="'.$url.'" type="application/'.$extension.'">
                    <embed src="'.$url.'" type="application/'.$extension.'" />
             </object>'
            .'</body>'
            . '</html>';
0 голосов
/ 12 ноября 2014

Откройте файл downloads.php из корневого файла.

Затем перейдите к строке 186 и измените ее следующим образом:

        if(preg_match("/\.jpg|\.gif|\.png|\.jpeg/i", $name)){
            $mime = getimagesize($download_location);
            if(!empty($mime)) {
                header("Content-Type: {$mime['mime']}");
            }
        }
        elseif(preg_match("/\.pdf/i", $name)){
            header("Content-Type: application/force-download");
            header("Content-type: application/pdf");
            header("Content-Disposition: inline; filename=\"".$name."\";");
        }

        else{
            header("Content-Type: application/force-download");
            header("Content-type: application/octet-stream");
            header("Content-Disposition: attachment; filename=\"".$name."\";");
        }
...