このサイトにはプロモーションが含まれます

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()などの出力はしないで下さい。

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

やんやん

プログラマーとしてLEMP環境に主に生息しており、DevOps 的な立ち回りをしながらご飯を食べている当ブログの管理人のやんやんと申します。
最近はTmux使うのを辞めました。

 

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

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

 

Twitterでフォローしよう

読んでみーな
おすすめの記事