Webフォームからのファイルアップロードを処理するPHPのサンプルコードです。
この記事の目次です。
1. ファイルアップロードをPHPで処理する
2. PHPのサンプルコード
この記事でいうファイルアップロードは、Webのフォームからファイルのアップロードを行うことです。
PHPにはファイルアップロードに関する機能が組み込まれていて、Webフォームでファイルをアップロードし、PHPで処理を行うのは難しくはありません。
ただし、ファイルのアップロードはセキュリティ面で注意が必要です。 /etc/passwdなどのパストラバーサル攻撃やファイルのプロパティやファイル内に仕込んだコードを意識したコーディングが必要です。 極力入力値を使わないよう努力する必要があります。
画像のアップロードを行うPHPのサンプルコードです。 アップロードするとファイルの幅を500pxに合わせてサイズ変更を行ってアップロードされます。 GDモジュールを使用します。
他にも考慮する点あるかと思いますが、 ファイルの形式などの基本的なチェックと画像編集ソフトにかけて万が一バイナリに不正コードが仕込まれても変換されるようにし、ファイル名ももともとのファイル名は使わないようにしてみました。
まずはフォーム部分です。 アップロードは「post」メソッドで、「multipart/form-data」を指定しないとできません。 入力チェックはサーバサイドで行わないと直接攻撃される恐れがあるのでフォームではしていません。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>アップロードサンプル</title> </head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="upload_file" id="upload_file"> <input type="submit" value="アップロード" name="submit"> </form> </body> </html>
次にPHP(upload.php)の内容です。
<?php
if(!isset($_POST['submit'])) {
echo 'フォーム送信されていませんでした。';
exit;
}
if ($_FILES['upload_file']['size'] > 5000000) {
echo 'ファイルサイズが大きすぎました。';
exit;
}
$tmp_file = $_FILES["upload_file"]["tmp_name"];
if(!getimagesize($tmp_file)) {
echo '画像ファイルと認識できませんでした。';
exit;
}
list($org_width, $org_height, $file_type) = getimagesize($tmp_file);
$org_image = "";
$ext_str = "";
switch ($file_type) {
case IMAGETYPE_JPEG:
$org_image = imagecreatefromjpeg($tmp_file);
$ext_str = '.jpg';
break;
case IMAGETYPE_PNG:
$org_image = imagecreatefrompng($tmp_file);
$ext_str = '.png';
break;
case IMAGETYPE_GIF:
$org_image = imagecreatefromgif($tmp_file);
$ext_str = '.gif';
break;
default:
echo "JPG、JPEG、PNG、GIF以外の形式でした。";
exit;
}
$width = 500;
$height = 500 * ($org_height/$org_width);
$canvas = imagecreatetruecolor($width, $height);
imagecopyresampled($canvas, $org_image, 0,0,0,0,
$width, $height, $org_width, $org_height);
$save_dir = "uploads/";
$time_str = date("YmdHis");
$extension = strtolower(pathinfo($tmp_file,PATHINFO_EXTENSION));
$save_file = 'uploads/' . $time_str . $ext_str;
switch ($file_type) {
case IMAGETYPE_JPEG:
imagejpeg($canvas, $save_file);
break;
case IMAGETYPE_PNG:
imagepng($canvas, $save_file, 9);
break;
case IMAGETYPE_GIF:
imagegif($canvas, $save_file);
break;
}
imagedestroy($org_image);
imagedestroy($canvas);
echo '「' . $tmp_file. '」がアップロードされました。';
echo '保存ファイルは「' . $save_file . '」です。';
?>
なお、アップロードされたファイルをセッション管理下で表示したい場合は、以下はのようにPHPで画像をレスポンスで返してあげれば解決します。
<php
$image_file = '<アップロードファイルパス>';
$file_info = new finfo(FILEINFO_MIME_TYPE);
$mime_type = $file_info->file($image_file);
header('Content-Type: '.$mime_type);
readfile($image_file);
?>
もっと知識を広げるための参考です。
プログラミング言語のPHPについてまとめています。 読み方はピーエイチピーです。for文やmysql、ページングの例など、PHPとは?からやさしく説明しています。
更新履歴になります。
スポンサーリンク
サイト内のページ
言語
C・C++
/HTML
/Java
/JavaScript
/PHP
/シェルスクリプト
開発環境
Ant
/Burp
/Eclipse
/Fiddler
/gcc
/gdb
/Git
/g++
/JDK
/JMeter
/JUnit
/Teraterm
/ZAP
技術・仕様
Ajax
/CORBA
/Jakarta EE(旧称J2EE、Java EE)
/JNI
ライブラリ/Framework/CMS
bootstrap
/jQuery
/FuelPHP
/Lucene
/MyBatis
/Seasar2
/Spring
/Struts
/WordPress
Web API
Google Maps
ITインフラ
OSとミドルウェア
Linux
/Windows
/シェル
ActiveMQ
/Tomcat
/MariaDB
/MySQL
/Nagios
/Redis
/Solr
ITインフラ
セキュリティ
公開サーバーのセキュリティ
SI
ホームページの作り方
スポンサーリンク
IPアドレス確認ツール
あなたのグローバルIPアドレスは以下です。
216.73.216.123
HTMLの表示色確認ツール
パスワード生成ツール
文字数のプルダウンを選択して、取得ボタンを押すと「a~z、A~Z、0~9」の文字を ランダムに組み合わせた文字列が表示されます。
ここに生成されます。
スポンサーリンク
Copyright (C) 2007-2024 zealseeds. All Rights Reserved.