Як змусити файли відкриватися в браузері замість завантаження (PDF)?


210

Чи є спосіб змусити PDF-файли відкриватися у веб-переглядачі, коли опція "Відобразити PDF у браузері" не знімається?

Я спробував використовувати тег embed та iframe, але він працює лише тоді, коли ця опція встановлена.

Що я можу зробити?

Відповіді:


419

Для того, щоб вказати браузеру , що файл повинен бути переглянуті в браузері, то 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 з коду на стороні сервера: ваша мова програмування на стороні сервера).


13
Для примусового завантаження я скоріше використовую Content-Type: application / octet-stream.
Папік Г. Табоада

25
@ PapickG.Taboada, але тоді система користувача може не знати тип файлу. Наприклад, якийсь користувач, можливо, вибрав "Завжди відкривати файли такого типу" для файлів PDF. Можливо, якщо ви хочете змінити налаштування користувача, тоді октет-потік стане правильним способом, але надання правильного типу та запропонованого імені файлу - це "правильний" спосіб забезпечити завантаження.
ColinM

2
привіт @ColinM Я тут трохи заплутався ... у нас виникають проблеми з наданням PDF, він просто дає скремблированний текст. де ми встановлюємо Тип вмісту: application / pdf Content-Disposition: inline; "filename.pdf"? 'Тому що ми завантажуємо його за допомогою кутового коду js. Отже, моє запитання: чи слід встановлювати тип вмісту перед завантаженням? Крім того, ми отримуємо лише посилання від бекенд-команди, URL, який дає шлях до файлу, який ми відкриваємо на новій вкладці, використовуючи: window.open (url, '_blank'). Focus ();
Кайлас

3
@Kailas Я не розумію, що ви намагаєтесь зробити. Відповідь стосується заголовків, які сервер повинен надіслати клієнту, відповідаючи на HTTP-запит для файлу PDF. Ці заголовки не впливають на завантаження файлу, вам потрібно мати код за URL-адресою, встановлену заголовками щоразу, коли клієнт завантажує його.
ColinM

1
@ColinM Спасибі приятелю, ти це правильно сказав, питання, коли ми налагоджували, було встановлено тип mime під час завантаження файлів. Це має зробити команда бек-енду. Я намагався отримати коди про те, як додати заголовки в java script, але це не вдалося. Дякую, як я зрозуміла від тебе справжню ідею ... :)
Kailas

19

Якщо ви використовуєте HTML5 (і, напевно, зараз усі користуються цим), є атрибут, який називається download.

Наприклад,

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

Тут filenameнеобов’язково, але якщо воно передбачено, воно буде приймати це ім'я для завантаженого файлу.


2
Якщо у вас є контроль над кодом сервера, ви повинні використовувати "attachchement", оскільки це дозволить використовувати той самий код генерації імені файлу. Якщо у вас немає контролю над сервером, це хороше рішення.
Крістоф Руссі

Це геніальне рішення проблеми, однак, як завжди, IE стримує нас від його використання: caniuse.com/#search=download
Рорі Маккросан

1
Важливо зауважити, що це не працює в різних областях (наприклад, політика з однаковим походженням перешкоджає). Якщо ви завантажуєте з одного домену, атрибут завантаження не працюватиме, якщо вміст зберігається в іншому домені. CORS може дозволити цьому вмісту проходити (не перевірений).
vol7ron

59
Це буквально протилежне тому, що просить ОП :)
Чак Ле Ботт

1
Так зрозумів! : \ Я зрозумів питання неправильно і відповів. Але багато людей приземляються тут, знаходячи лише зворотне, тому відповідь не редагували / не видаляли.
Акшай

16

Правильний тип application/pdfдля PDF, а не application/force-download. Це виглядає як злом для деяких застарілих браузерів. Завжди використовуйте правильний міметик, якщо можете.

Якщо у вас є контроль над кодом сервера:

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

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

ПРИМІТКА. Я вважаю за краще встановити ім'я файлу на стороні сервера, оскільки у вас може бути більше інформації та ви можете використовувати загальний код.


2

Якщо у вас є Apache, додайте це у .htaccessфайл:

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

як ми можемо додати кілька розширень? Я також хочу додати розширення DOC та XLS. Прошу запропонувати мені. Заздалегідь спасибі.
Kamlesh

Це робить протилежне тому, що просять
Квентін,

1

На жаль, у моєму попередньому дописі були помилки введення тексту.

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

Якщо ви не хочете, щоб браузер спонукав користувача, тоді використовуйте "вбудований" для третього рядка замість "вкладення". Inline працює дуже добре. Дисплей PDF негайно, не вимагаючи від користувача натиснути на Відкрити. Я використовував "вкладення", і це підкаже користувача для відкриття, збереження. Я намагався змінити гайку налаштувань браузера, це не заважає запиту.


4
Яка попередня публікація?
Пітер Мортенсен

0

Це для 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");
    }

-1

Хоча наступне працює добре на firefox, воно НЕ працює в хромованих та мобільних браузерах.

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

Щоб виправити помилку браузера Chrome та мобільні пристрої, виконайте наступне:

  • Зберігайте свої файли в каталозі свого проекту
  • Використовуйте Google Viewer 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>

-4

Відкрийте downloads.php з rootfile.

Потім перейдіть до рядка 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."\";");
        }

7
Не згадуйте, що вони використовують PHP. Що робити, якщо їхній сервіс є в Python чи .NET?
Maxime Rouiller

1
... поговоримо про вихід з поля. Він навіть не каже, про які рамки йде мова.
Архонічний

-4

Це можна зробити наступним чином:

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

Але тепер дозвольте лише певні необхідні файли.

Я використовував цей код, і він прекрасно працював.


Не згадуйте, що вони використовують Apache. Що робити, якщо вони використовують IIS? Або експрес?
Maxime Rouiller


-7

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

1
headerне працює після того, як ви почали виводити тіло запиту (і він не повертає рядок для об'єднання в HTML-документ)
Квентін,

-9

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


3
Що робити, якщо ви не використовуєте AdobeReader або не використовуєте Windows? Ви відповідаєте, не вийде. Крім того, потрібно вимагати від користувача змінити їх налаштування, чого ви не можете зробити в реальному світі.
Clawfire

-12

Якщо ви посилаєтесь на .PDF, він відкриється у браузері.
Якщо це поле не встановлено, воно повинно посилатися на .zip, щоб примусити завантаження.

Якщо .zip не є варіантом, тоді використовуйте заголовки в PHP для примусового завантаження

header('Content-Type: application/force-download'); 
header('Content-Description: File Transfer'); 

Так, але мені потрібен спосіб змусити відкрити в браузері не завантажувати. Я поняття не маю, чи можливо це.
elloalisboa

2
Якщо ви не змушуєте його завантажувати, ви змушуєте його відкриватись у браузері. Якщо він не відкриється в браузері, це тому, що у користувача є певні налаштування, які ви не можете перекрити, або у них немає програмного забезпечення для читання PDF.
Кірк Стробек

1
Власне, дивіться мою відповідь.
Габріель Райан Нахміас

21
Це неправильно. Немає програми / примусового завантаження. Ви також можете використовувати alskjdsdjk / aljksdlasdj. Веб-переглядач завантажить, оскільки не знає цього типу mime. Правильний тип mime для завантаження буде мені програмою / octet-stream
Papick G. Taboada
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.