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

B!

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

 

最新の記事はこちらから