トップ 言語 PHP ハウツー ファイルアップロード

PHPのファイルアップロードのサンプルコード

Webフォームからのファイルアップロードを処理するPHPのサンプルコードです。

▲記事トップへ

目次

この記事の目次です。

1. ファイルアップロードをPHPで処理する
2. PHPのサンプルコード

もっと知識を広げるための参考
更新履歴

1. ファイルアップロードをPHPで処理する

この記事でいうファイルアップロードは、Webのフォームからファイルのアップロードを行うことです。

PHPにはファイルアップロードに関する機能が組み込まれていて、Webフォームでファイルをアップロードし、PHPで処理を行うのは難しくはありません。

ただし、ファイルのアップロードはセキュリティ面で注意が必要です。 /etc/passwdなどのパストラバーサル攻撃やファイルのプロパティやファイル内に仕込んだコードを意識したコーディングが必要です。 極力入力値を使わないよう努力する必要があります。

2. PHPのサンプルコード

画像のアップロードを行う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

プログラミング言語の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インフラサーバー
公開Webサーバー

ITインフラネットワーク
プログラミング /構築

ITインフラセキュリティ
公開サーバーのセキュリティ

PC製品
ZOTAC

SI
ホームページの作り方

その他
IT用語 /ITスキル体系

スポンサーリンク

関連サイト内検索ツール

zealseedsおよび関連サイト内のページが検索できます。

IPアドレス確認ツール

あなたのグローバルIPアドレスは以下です。

3.149.23.123

HTMLの表示色確認ツール

パスワード生成ツール

文字数のプルダウンを選択して、取得ボタンを押すと「a~z、A~Z、0~9」の文字を ランダムに組み合わせた文字列が表示されます。

ここに生成されます。

スポンサーリンク