ファイルのアップロード
ファイルを指定のディレクトリにアップロードするモジュール
.htaccessの設定
必要に応じて、以下の設定を変更。
デフォルトの値はphpinfoで要確認。
# スクリプトが確保できる最大メモリ
php_value memory_limit 256M
# POSTデータに許可される最大サイズ
php_value post_max_size 128M
# アップロードされるファイルの最大サイズ
php_value upload_max_filesize 10M
# スクリプトが強制終了されるまでに許容される最大の時間
php_value max_execution_time 120
HTML
<!-- enctype="multipart/form-data"を指定 -->
<form action="upload.php" method="post" enctype="multipart/form-data">
<!-- ファイルサイズ上限 -->
<input type="hidden" name="MAX_FILE_SIZE" value="10000000">
<input type="file" name="userfile" required>
<!-- ファイル複数の場合 -->
<input type="file" name="userfiles[]" multiple required>
<input type="submit">
</form>
$_FILESの内容
name: ローカルファイル名、 type: MIME型(ブラウザによって内容が異なる)、 tmp_name: テンポラリファイル名、 error: エラーコード(0は成功、1,2はサイズ上限超過、3~8はアップロード失敗)、 size: ファイルサイズ。
Array
(
[userfile] => Array
(
[name] => foo.jpg
[type] => image/jpeg
[tmp_name] => C:\WINDOWS\Temp\php37DE.tmp
[error] => 0
[size] => 383512
)
)
ファイル複数の場合
Array
(
[userfiles] => Array
(
[name] => Array
(
[0] => foo.jpg
[1] => bar.jpg
)
[type] => Array
(
[0] => image/jpeg
[1] => image/jpeg
)
[tmp_name] => Array
(
[0] => C:\WINDOWS\Temp\php37DE.tmp
[1] => C:\WINDOWS\Temp\php37EE.tmp
)
[error] => Array
(
[0] => 0
[1] => 0
)
[size] => Array
(
[0] => 383512
[1] => 360730
)
)
)
エラーの場合
Array
(
[userfile] => Array
(
[name] => foo.jpg
[type] =>
[tmp_name] =>
[error] => 2
[size] => 0
)
)
PHP
/**
* ファイルのアップロード
*
* @param array $file_data
* @param string $target_path
* @param string $upload_name
* @return boolean
*/
function getFileUpload($file_data, $target_path, $upload_name = '')
{
// ファイルの有無
if (empty($file_data)) {
return FALSE;
}
// 0は成功、それ以外は失敗
if ($file_data['error'] != '0') {
return FALSE;
}
// 存在チェック
if (! file_exists($target_path)) {
return FALSE;
}
try {
// アップロード後のファイル名が未定義の場合は元ファイルと同じに
if (empty($upload_name)) {
$upload_name = $file_data['name'];
}
// アップロード後のファイルの移動先
$destination = $target_path . $upload_name;
// テンポラリからファイルを移動
move_uploaded_file($file_data['tmp_name'], $destination);
} catch (Exception $e) {
return FALSE;
}
return TRUE;
}
使用例
PHP
if (getFileUpload($_FILES['userfile'], '/home/appli/var/', $upload_name = '')) {
echo "成功";
} else {
echo "失敗";
}
// 複数対応
if (! empty($_FILES['userfiles'])) {
// $_FILES['userfiles']['name'][0]を$files[0]['name']へ
foreach($_FILES['userfiles'] as $filesKey => $filesVal) {
foreach($filesVal as $filesKey2 => $filesVal2) {
$files[$filesKey2][$filesKey] = $filesVal2;
}
}
}
// 1つめ
getFileUpload($files[0], '/home/appli/var/', $upload_name = '');
// 2つめ
getFileUpload($files[1], '/home/appli/var/', $upload_name = '');