HTMLフォームとPHPを使ったクライアント側の画像アップロード・検証処理
Webアプリケーションを開発する際、クライアント側(ブラウザ)からサーバーへ画像ファイルを送信し、受け取ったデータが本当に画像であるかを検証してから保存するという処理は非常に重要です。ここでは、HTMLフォームで画像を選択し、PHPでその妥当性をチェックした上でサーバーに保存する一連の流れを解説します。
1. アップロード用のHTMLフォーム
まず、ユーザーが画像ファイルを選択できるようにするためのフォームを作成します。enctype="multipart/form-data" を指定しないとファイルが正しく送信されないため注意してください。
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="image"> <input type="submit" value="アップロード"> </form>
2. PHPによる画像の検証と保存
次に、送信されたファイルを受け取る側のPHPスクリプトです。getimagesize() 関数を使ってファイルが正規の画像かどうかを判定し、問題なければ指定ディレクトリへ移動します。以下のコードを実際に実行してみてください。
<?php
if (isset($_FILES["image"])) {
// ファイルが画像として有効かどうかを検証
$iSize = getimagesize($_FILES["image"]["tmp_name"]);
if ($iSize !== false) {
$myFile = "/tmp/" . basename($_FILES["image"]["name"]);
if (move_uploaded_file($_FILES["image"]["tmp_name"], $myFile)) {
echo "File stored at " . $myFile;
} else {
echo "Image storage failed!";
}
} else {
echo "This isn’t an image!";
}
} else {
echo "Image not available to upload!";
}
?>
3. コードのポイント解説
このスクリプトの動作は、大きく分けて次のステップで構成されています。
- ファイルの存在確認:
isset($_FILES["image"])により、フォームから画像が送信されているかどうかを判定します。未送信の場合は「Image not available to upload!」というメッセージを返します。 - 画像形式の検証:
getimagesize()は、ファイルの中身を解析して幅・高さ・MIMEタイプなどの情報を返します。画像として認識できない場合はfalseを返すため、「This isn’t an image!」と表示され、不正なファイルの保存を防げます。 - ファイルの移動と保存:検証に成功すると、
move_uploaded_file()によって一時フォルダから/tmp/ディレクトリへファイルが移動されます。保存先のパスはbasename()で取得した元のファイル名を利用しています。
4. 実装時の注意点
実際の運用では、さらに以下の点を考慮することをおすすめします。
- ファイル名はそのまま使わず、
uniqid()などで一意な名前に変更すると、同名ファイルの上書きやパストラバーサル攻撃のリスクを軽減できます。 /tmp/のような公開ディレクトリではなく、Webから直接アクセスできない場所に保存し、必要に応じてスクリプト経由で配信するのが安全です。- 拡張子だけでなく
getimagesize()やfinfoによるMIMEタイプの確認を必ず行い、悪意あるスクリプトのアップロードを防ぎましょう。
このように、HTMLフォームとPHPを組み合わせることで、クライアント側からの画像アップロードに対して、シンプルながら有効な検証・保存処理を実現できます。
-
Pythonでの画像処理入門!PillowとOpenCVで学ぶ基本操作
Pythonには、画像処理に役立つ豊富なライブラリが用意されています。代表的なものは以下の通りです。 OpenCV − リアルタイムコンピュータビジョンを主眼とした画像処理ライブラリ。2D・3D特徴量ツールキット、顔認識やジェスチャー認識、ヒューマンコンピュータインタラクション、モバイルロボティクス、物体識別など、幅広い分野で活用されています。 NumPy / SciPy − 画像の操作や処理に利用される数値計算ライブラリ。 scikit-image − 画像処理向けの多数のアルゴリズムを提供するライブラリ。 Pillow(Python Imaging Library) − サムネイル作成、
-
BashスクリプトとImageMagickで画像処理を自動化する方法
ライターの仕事は言葉だけではありません。特にテクニカルライティングでは、技術やプロセスを伝えるために大量のスクリーンショットを扱うことがよくあります。さらに、公開プラットフォームごとに画像フォーマットやファイルサイズなど、異なる要件が課されることも少なくありません。 ITコンサルタント兼システムエンジニアとして、私はクライアントへの納品物として数多くの技術文書を作成してきました。当時はMicrosoft Word(.doc)形式が求められるのが一般的でした。文書はコンテンツを追加するたびにあっという間に肥大化していきます。初期のスクリーンショットはビットマップ(.bmp)形式が主流で、ファイル