web-dev-qa-db-ja.com

PDFファイルのダウンロード用の正しいPHPヘッダー

ユーザーがリンクをクリックしたときに、アプリケーションで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");

これはうまくいかないようですが、過去にこの問題をうまく分類した人はいますか?

59

w3schools の例2は、達成しようとしていることを示しています。

<?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");
?>

また、それを覚えて、

実際の出力を送信する前にheader()を呼び出す必要があることに注意することが重要です(PHP 4以降では、出力バッファリングを使用してこの問題を解決できます)

111
gat
$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;
22
Marin Vartan

コードで考慮すべきことがいくつかあります。

まず、これらのヘッダーを正しく記述します。サーバーが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の前または?>の後には絶対に何もないことを確認してください。空の行も含めないでください。

6
Havenard

私は最近同じ問題を抱えており、これは私を助けました:

    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
haayek

これを試すことができますか、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
Krish R

ファイルのサイズを定義する必要があります...

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

そして、この行は間違っています:

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

クォータを台無しにしました。

0
Flash Thunder