PHPでPDFを扱うときの注意点

PDFを扱うときの構文

$output_filename = "表示させる時のファイル名称";
$output_file = "表示させたいファイル";

header('Content-type:  apprication/pdf');
header('Content-Disposition: inline; filename="'.$output_filename.'"');
header('Content-Length:' filesize($output_file));
readfile($output_file);

解説

・Content-type→扱いたいファイルの種類で変更させる。拡張子ごとに合わせた指定名があるよ。
参考ファイル:Content-Typeの一覧

・Content-Disposition: inline→ダウンロードさせるならattachment、ブラウザで表示させるならinline。

 

注意

相対パス使って

扱いたいファイルをURLを含む形での読み込むとエラーが発生します。

○→./../xxx/yyy/zzz.pdf
×→https:xxx/yyy/zzz.pdf

すみませんが、理由はわかりません。

文字の出力はしないで

header();の前にechoやvar_dump()などの出力はしないで下さい。

ファイルの出力の前に文字の出力があると、ファイル内に余計な文字が入っていたり、ファイルの読み込みに失敗します。

ブラウザ表示からダウンロード

「Content-Disposition: inline;」でブラウザ表示をした際にブラウザからダウンロードを実施できない場合は、Headerにてキャッシュの制御が必要です。
※なかなか参考サイトがなかったので、WEB系の人は覚えていると良いかも。。。

$output_filename = "表示させる時のファイル名称";
$output_file = "表示させたいファイル"; 

header('Cache-Control: private,max-age=90, must-revalidate'); //追記
header('Content-type: apprication/pdf'); 
header('Content-Disposition: inline; filename="'.$output_filename.'"'); 
header('Content-Length:' filesize($output_file)); 
readfile($output_file);

 

やりたいこととしては、以下の通り。

privateキャッシュをプライベート状態で保持
max-ageキャッシュを保持する時間を指定。短く設定したほうが良いと考え、90秒に設定
must-revalidateキャッシュが新鮮か検証
参考記事

https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cache-Control

 

S3から取得したPDFデータの表示

S3から取得したPDFを表示する方法は以下の通り。
※AWS-SDK-PHP必要。

//読み込み
require '../../vendor/autoload.php';

use Aws\S3\S3Client;  

やりたいことは以下。

  • ファイルを識別するためにContent-type: apprication/pdfを指定
  • S3からメタデータを取得しているので、出力するのみ

 

うぇーい

処理内容忘れたらこの記事戻ってきます。

PDFの扱い進化させたいので、よりよい方法ありましたらご享受ください。

 

コメントを残す

Twitterでフォローしよう

おすすめの記事