правильные заголовки PHP для загрузки PDF-файла


Я действительно изо всех сил пытаюсь заставить свое приложение открывать pdf-файл, когда пользователь нажимает на ссылку.

До сих пор тег привязки перенаправляет на страницу, которая отправляет заголовки, которые являются:

$filename='./pdf/jobs/pdffile.pdf;

$url_download = BASE_URL . RELATIVE_PATH . $filename;


header("Content-type:application/pdf");



header("Content-Disposition:inline;filename='$filename");

readfile("downloaded.pdf");

Похоже, это не работает, кто-нибудь успешно решал эту проблему в прошлом?

Author: useyourillusiontoo, 2013-11-19

7 answers

Пример 2 на w3schools показывает, чего вы пытаетесь достичь.

<?php
header("Content-type:application/pdf");

// It will be called downloaded.pdf
header("Content-Disposition:attachment;filename='downloaded.pdf'");

// The PDF source is in original.pdf
readfile("original.pdf");
?>

Также помните, что,

Важно отметить, что заголовок() должен быть вызван до отправки любого фактического вывода (в PHP 4 и более поздних версиях вы можете использовать буферизацию вывода для решения этой проблемы)

 89
Author: gat, 2018-07-10 05:34:13
$name = 'file.pdf';
//file_get_contents is standard function
$content = file_get_contents($name);
header('Content-Type: application/pdf');
header('Content-Length: '.strlen( $content ));
header('Content-disposition: inline; filename="' . $name . '"');
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
echo $content;
 18
Author: Marin Vartan, 2016-02-19 16:51:26

В вашем коде есть некоторые вещи, которые следует учитывать.

Во-первых, правильно напишите эти заголовки. Вы никогда не увидите, чтобы сервер отправлял Content-type:application/pdf, заголовок Content-Type: application/pdf, через пробел, с заглавными первыми буквами и т. Д.

Имя файла в Content-Disposition - это только имя файла, а не полный путь к нему, и, хотя я не знаю, является ли оно обязательным или нет, это имя завернуто в ", а не '. Кроме того, отсутствует ваш последний '.

Content-Disposition: inline подразумевает, что файл должен отображаться, не загружено. Вместо этого используйте attachment.

Кроме того, сделайте расширение файла прописным, чтобы оно было совместимо с некоторыми мобильными устройствами.

Все сказанное выше, ваш код должен выглядеть примерно так:

<?php

    $filename = './pdf/jobs/pdffile.pdf';

    $fileinfo = pathinfo($filename);
    $sendname = $fileinfo['filename'] . '.' . strtoupper($fileinfo['extension']);

    header('Content-Type: application/pdf');
    header("Content-Disposition: attachment; filename=\"$sendname\"");
    header('Content-Length: ' . filesize($filename));
    readfile($filename);

Content-Length это необязательно, но также важно, если вы хотите, чтобы пользователь мог отслеживать ход загрузки и определять, была ли загрузка прервана. Но при его использовании вы должны убедиться, что вы ничего не будете отправлять вместе с данными файла. Убедиться нет абсолютно ничего до <?php или после ?>, даже пустой строки.

 5
Author: Havenard, 2016-03-08 18:13:05

Недавно у меня была такая же проблема, и это помогло мне:

    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="FILENAME"'); 
    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("PATH/TO/FILE")); 
    ob_clean(); 
    flush(); 
    readfile(PATH/TO/FILE);      
    exit();

Я нашел этот ответ здесь

 3
Author: haayek, 2017-04-16 11:53:19

Можете ли вы попробовать это, readfile нужен полный путь к файлу.

        $filename='/pdf/jobs/pdffile.pdf';            
        $url_download = BASE_URL . RELATIVE_PATH . $filename;            

        //header("Content-type:application/pdf");   
        header("Content-type: application/octet-stream");                       
        header("Content-Disposition:inline;filename='".basename($filename)."'");            
        header('Content-Length: ' . filesize($filename));
        header("Cache-control: private"); //use this to open files directly                     
        readfile($filename);
 1
Author: Krish R, 2013-11-19 19:35:41

Вам необходимо определить размер файла...

header('Content-Length: ' . filesize($file));

И эта строка неверна:

Заголовок ("Расположение содержимого: встроенное; имя файла='$имя файла");

Ты перепутал квоты.

 0
Author: Flash Thunder, 2013-11-19 19:30:29

Просто взгляните на эту ссылку: https://gist.github.com/ScottPhillips/3026050

<?php 
header('Content-Type: application/pdf');
echo file_get_contents('filename.pdf');
?> 
 0
Author: André Abboud, 2018-07-10 05:40:54