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 for PHP必要。
//読み込み use Aws\S3\S3Client; use Aws\S3\Exception\S3Exception; try { $s3Client = S3Client::factory([ 'region' => '', //リージョン名 'version' => 'latest', ]); // S3からオブジェクトを取得 $file_obj = $s3Client->getObject([ 'Bucket' => '' //バケット名, 'Key' => ''//ファイルパス→可変にする場合は変数設定 ]); $read_file_name = array ( 'contentType' => $file_obj['@metadata']['headers']['content-type'], 'body' => $file_obj['Body']->getContents(), ); header('Cache-Control: private,max-age=180'); header('Content-Type: application/pdf'); header('Content-Disposition: inline; filename="' . $download_file_name . '"'); while (ob_get_level()) { ob_end_clean(); } echo $read_file_name['body']; } catch (S3Exception $e) { echo $e->getMessage(); echo '<br>'; echo '<p class="text-center font-weight-bold">不正なデータです。</p>'; die(); }
前提は以下。
- AWS SDK for PHPのインストール
- S3のアクセス権の開放(EC2やLambdaを使用している場合は、そのサーバーからのアクセスのみ開放)
やりたいことは以下。
- S3バケットからPDFメタデータ取得
- headerをPDFに指定してメタデータを出力
- ファイルが存在しない場合も鑑みてtry-catchを使用
うぇーい
処理内容忘れたらこの記事戻ってきます。
PDFの扱い進化させたいので、よりよい方法ありましたらご享受ください。