お客様から、
既存システムにPDFファイルをアップロードする機能を追加したという依頼を頂きました。
そこで、今回は、PHPでPDFファイルをアップロードする方法について少し説明したいと思います。
PHPでPDFファイルをアップロードする方法
まず、PDFファイルを選択するための画面のHTMLを用意します。
</body>
・
・
<form action="check.php" method="POST" enctype="multipart/form-data">
<input type="file" name="pdf_file"><br>
<input type="submit" value="アップロード">
</form>
・
・
</body>
次に、PDFファイルのアップロード処理を行うPHP側のコードを書きます。
<?php
if(is_uploaded_file($_FILES["pdf_file"]["tmp_name"])){
if(move_uploaded_file($_FILES["pdf_file"]["tmp_name"], "ファイルの移動先のパス")){
echo "アップロード完了です。";
}else{
echo "アップロードに失敗しました。";
}
}
?>
みたいになりますね。
※かなり雑なコードですが。。。
これで完了であれば非常に簡単なんです。
ですが、PDFファイルのアップロード機能なので、PDF以外のファイルをアップロードしていないかのチェックを行わないといけません。
例えば、悪意のあるスクリプトを記述したHTMLなどをアップロードされると深刻な脆弱性になってしまうこともあります。
アップロードするファイルの種類が決まっている場合、必ずファイルのチェック処理は行って下さい。
そのための処理を追加したのですが、今回ここで問題が1つ発生しました・・・
まずは、以下のコードで拡張子のチェックを行います。
//拡張子をチェック
$ext = pathinfo($_FILES["pdf_file"]["name"], PATHINFO_EXTENSION);
if($ext != "pdf"){
echo "ファイルの拡張子が不正です。\n";
}
これは問題なし!!
次に、以下のコードでファイルタイプのチェックを行います。
//ファイルのMINEタイプをチェック
if($_FILES["pdf_file"]["type"] != "application/pdf"){
echo "ファイルのMINEタイプが不正です。\nアップロード可能なファイルはPDFのみです。\n";
}
これも問題が無いように思いますが、テストしてみるとまずい動作が見つかりました。
テストの為に画像(今回はJPEGファイル)の拡張子を無理やり「.pdf」に変更してアップロードしてみたのですが、
なぜかこのチェック処理を抜けてアップロードできてしまいます。
どうも、
$_FILES[“pdf_file”][“type”]に入っているファイルタイプが、
「image/jpeg」ではなく「application/pdf」になってしまっているようです。
拡張子を無理やり変えただけのファイルまでPDFファイルとして認識されてしまうのは気持ちが悪いのです。
そこで、今回は以下のコードに書き換えてやることで、
こちらの意図通りの処理を行うことが出来ました。
//ファイルのMINEタイプをチェック
$fileinfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($fileinfo, $_FILES["pdf_file"]["tmp_name"]);
finfo_close($fileinfo);
if($mimeType != "application/pdf"){
echo "ファイルのMINEタイプが不正です。\nアップロード可能なファイルはPDFのみです。\n";
exit;
}
ブログに全コードを記載するのは大変なので、かなりおおざっぱなコードになってしまいました。
ですが、取りあえずこんな感じでPDFファイルのアップロード機能の追加は可能です。























