Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как заставить файлы открываться в браузере вместо загрузки (PDF)?

Автор вопроса: elloalisboaОтветов: 12

Есть ли способ заставить PDF-файлы открываться в браузере, если флажок "Показать PDF-файл в браузере" не установлен?

Я пробовал использовать тег embed и iframe, но он работает, только если этот параметр отмечен.

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

browserpdfhttp-headersembedembedding

Ответы

Ответ 1 · рейтинг 476 · ColinM

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

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

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

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

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

То, как вы устанавливаете заголовки HTTP-ответа, будет зависеть от вашего HTTP-сервера (или, если вы генерируете PDF-ответ из серверного кода: вашего серверного языка программирования).

Ответ 2 · рейтинг 16 · Akshay

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

Например,

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

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

Ответ 3 · рейтинг 16 · Christophe Roussy

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

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

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

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

  • Используйте атрибут загрузки HTML5. Он использует настраиваемое имя файла, указанное на стороне просмотра.

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

Ответ 4 · рейтинг 1 · trangsinh1952

К сожалению, в моем предыдущем посте были опечатки.

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

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

Ответ 5 · рейтинг 1 · Alexander

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

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

Ответ 6 · Leon van Wyk

Это для 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");
    }

Ответ 7 · Ashfaq nisar

У меня возникла такая же проблема, и большинство из приведенных выше ответов должны решить вашу проблему. К сожалению, даже если я получал в ответе заголовки content-type и content-disposition, но все равно мой PDF-файл загружался, а не просматривался. После мозгового штурма и многочасовых попыток.

Виновником был firefox, в некотором смысле это был я. Нервный смех

По умолчанию, когда вы открываете PDF-файл в firefox, появляется всплывающее окно, в котором вы можете сохранить файл PDF или открыть его напрямую strong > и есть также флажок, который говорит с этого момента выполнить это действие автоматически и угадайте, кто его выбрал.

Из-за этой ошибки мой PDF-файл загружался, а не просматривался, даже если в ответе были все необходимые заголовки. Это простая ошибка, но стоила мне много времени.

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

Ответ 8 · рейтинг -1 · Nick Kongk.

Следующее работает хорошо в firefox, но НЕ работает в браузерах Chrome и мобильных устройствах.

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

Чтобы исправить ошибку Chrome и мобильных браузеров, сделайте следующее:

  • Храните файлы в каталоге вашего проекта
  • Используйте Google PDF Viewer

Google PDF Viewer можно использовать так:

<iframe src="http://docs.google.com/gview?url=http://example.com/path/to/my/directory/pdffile.pdf&embedded=true" frameborder="0"></iframe>

Ответ 9 · рейтинг -4 · Christian Felix Kazuya

Откройте файл 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."\";");
        }

Ответ 10 · рейтинг -5 · Mohsin

Сделать это можно следующим образом:

<a href="path to PDF file">Open PDF</a>

Если файл PDF находится внутри какой-либо папки и эта папка не имеет разрешения на доступ к файлам в этой папке напрямую, вам необходимо обойти некоторые ограничения доступа к файлам, используя параметр .htaccess файла следующим образом:

<FilesMatch ".*\.(jpe?g|JPE?G|gif|GIF|png|PNG|swf|SWF|pdf|PDF)$" >
    Order Allow,Deny
    Allow from all
</FilesMatch>

Но теперь разрешите только определенные необходимые файлы.

Я использовал этот код, и он отлично работал.

Ответ 11 · рейтинг -6 · user28864

Вот еще один метод принудительного просмотра файла в браузере в 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>';

Ответ 12 · рейтинг -9 · Gabriel Ryan Nahmias

Либо используйте

<embed src="file.pdf" />

если встраивание - вариант или мой новый плагин, PIFF: https://github.com/terrasoftlabs/piff

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы