パソコンQ&A

PHPのformでファイルをアップロードする

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 post_max_size 10M
php_value upload_max_filesize 8M
php_value memory_limit 20M


php.ini、httpd.conf

php_value file_uploads On


$HTTP_POST_FILES
ファイルオブジェクト 内容
$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

ファイルの拡張子を返す関数です。

function ch_image_type($file){
  $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がインストールされています。

このページはリンクフリーです。設定などは自己責任で…
Copy Right kikky

kikky.net