PHPのフォームでファイルをアップロードするには
<form name="【フォーム名】" action="【処理PHPファイル名】" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="50000">
<input type="file" name="userfile">
……………
………
……………
<input type="submit" name="submit" value="送信">
</form>
[参考記事] ファイルフォームタグの説明(フォームタグのまとめ)
ファイルをフォームで送信する場合は必ずformタグにenctype="multipart/form-data"を指定します。
同じファイル内で処理するには
【処理PHPファイル名】は<?=$_SERVER['SCRIPT_NAME']?>とするとよい。
受け取り側のPHPファイル内では数$_FILESというスーパーグローバル変数として処理されます。
(4.1.0以前はスーパーグローバル変数は使えないので定義済みの変数の$HTTP_POST_FILESを使います)
ファイルオブジェクト | 内容 |
---|---|
$_FILES['userfile']['name'] | クライアントマシンの元のファイル名 |
$_FILES['userfile']['type'] | アップロードされたファイルファイルのMIME型 |
$_FILES['userfile']['size'] | アップロードされたファイルのバイトサイズ |
$_FILES['userfile']['tmp_name'] | サーバーにアップ後のテンポラリファイルの名前 |
$_FILES['userfile']['error'] | ファイルアップロードに関するエラーコード |
$_FILES['userfile']['error']のエラーコード
定数 | 値 | エラー内容 |
UPLOAD_ERR_OK | 0 | アップロード成功 |
UPLOAD_ERR_INI_SIZE | 1 | php.iniに設定されたupload_max_filesize値を超えてます |
UPLOAD_ERR_FORM_SIZE | 2 | フォームで設定されたMAX_FILE_SIZE値を超えてます |
UPLOAD_ERR_PARTIAL | 3 | 一部分のみしかアップロードされていません |
UPLOAD_ERR_NO_FILE | 4 | アップロードされませんでした |
フォームにMAX_FILE_SIZE値を設定していてもフォームは偽装できたりと、アテにできないので 必ずPHP内部で$_FILES['userfile']['size']を使って2重チェックをしたほうがいいです。
フォームで複数のファイルをアップロードする場合
<input name="userfile[1]" type="file">
とすると
$_FILES['userfile']['name'][1]
となります。
実際の使い方
<?php
if (is_uploaded_file($_FILES['userfile']['tmp_name'])){
move_uploaded_file($_FILES['userfile']['tmp_name'], 【アップロード先+ファイル名】);
}
?>
move_uploaded_fileはrenameと同じようなものです。
じゃあrenameを使ったら?と考える人もいるかもしれませんがrenameやcopyだとエラーが出る場合があるようです。
サムネイルを同時に作成する処理などで2回ファイルを操作する場合にはmove_uploaded_fileは使えません。
あくまでmove(動かす)_uploaded_file(アップロードしたファイル)ですから…
ファイルがアップされたらphp.iniのupload_tmp_dirに設定されているテンポラリディレクトリに保存され、処理が終了した場合に テンポラリディレクトリに保存されたファイルは削除されます。
upload_tmp_dirがno valueなど設定されていなかったらデフォルトの場所
Linuxなら/tmpや/var/tmpです。
テンポラリファイル=テンポラリディレクトリに一時的に保存されたファイル
upload_max_filesizeがフォームで送信できる最大容量
PHP 4.2.3までは
ini_set("upload_max_filesize","10M");
これで変更できてましたが、
PHP_INI_PERDIRに変わったためphp.ini、httpd.conf、.htaccessでの変更となります。
一般に
upload_max_filesize < post_max_size < memory_limit
です。
マニュアルのpost_max_sizeに次のようにあります。
configureスクリプトでメモリ制限を有効とした場合、memory_limitも ファイルアップロードに影響します。
一般的に memory_limit は、post_max_sizeよりも大きくする必要があります。
.htaccess
php_value upload_max_filesize 8M
php_value memory_limit 20M
php.ini、httpd.conf
ファイルオブジェクト | 内容 |
---|---|
$HTTP_POST_FILES['userfile']['name'] | クライアントマシンの元のファイル名 |
$HTTP_POST_FILES['userfile']['type'] | アップロードされたファイルファイルのMIME型 |
$HTTP_POST_FILES['userfile']['size'] | アップロードされたファイルのバイトサイズ |
$HTTP_POST_FILES['userfile']['tmp_name'] | サーバーにアップ後のテンポラリファイルの名前 |
getimagesize($_FILES['file']['tmp_name'])の3番目の引数
ID | 拡張子 |
---|---|
1 | .gif |
2 | .jpg |
3 | .png |
4 | .swf |
5 | .psd |
6 | .bmp |
7 | .tiff |
8 | .tiff |
9 | .jpc |
10 | .jp2 |
11 | .jpx |
12 | .jb2 |
13 | .swc |
14 | .iff |
15 | .wbmp |
16 | .xbm |
ファイルの拡張子を返す関数です。
$id=getimagesize($file);
switch( $id[2] ){
case 1:
return '.gif';
break;
case 2:
return '.jpg';
break;
case 3:
return '.png';
break;
case 4:
return '.swf';
break;
case 5:
return '.psd';
break;
case 6:
return '.bmp';
break;
case 7:
return '.tiff';
break;
case 8:
return '.tiff';
break;
case 9:
return '.jpc';
break;
case 10:
return '.jp2';
break;
case 11:
return '.jpx';
break;
case 12:
return '.jb2';
break;
case 13:
return '.swc';
break;
case 14:
return '.iff';
break;
case 15:
return '.wbmp';
break;
case 16:
return '.xbm';
break;
default:
return '';
break;
}
return false;
}
GDのバージョンが2.0.28より低い場合は、アニメーションGIFは使えません。
このバージョンのGDでは、アニメーションGIFを拡大縮小など画像加工をすると1フレーム目の画像のみの固定画像となります。
PHPにbundleされているGDは2.0.28 compatibleとなるので(PHP5.2.1で確認)、アニメーションGIFを使用したい場合は次の方法があります。
(1)バンドルされているGDは使わずに、2.0.29以降のGDを別にインストールする。
(2)execでImageMagickを呼び出す。(execを使うと処理が遅くなります。)
(3)PECLのImagickを使う。Imagickダウンロードページ
ただしこのサイトのサーバーにはアニメーションGIFに対応したGDがインストールされています。