
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の扱い進化させたいので、よりよい方法ありましたらご享受ください。


