ファイルアップロードのチュートリアル
HTML
<form enctype="multipart/form-data" action="action.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
<input name="userfile" type="file" />
<input type="submit" value="Go" />
</form>
action.php
アップロードを処理する PHP ファイルの名前です (以下を参照)。
MAX_FILE_SIZE
type の入力の直前に指定する必要がありますfile
。この値はクライアントで簡単に操作できるため、信頼しないでください。その主な利点は、ユーザーがファイルをアップロードする前に、ファイルが大きすぎることを早期に警告することです。
- 入力の名前は type で変更できますが
file
、スペースが含まれていないことを確認してください。PHP ファイル (以下) の対応する値も更新する必要があります。
PHP
<?php
$uploaddir = "/www/uploads/";
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "Success.\n";
} else {
echo "Failure.\n";
}
echo 'Here is some more debugging info:';
print_r($_FILES);
print "</pre>";
?>
アップロード先フォルダーは、HTTP 経由でアクセスできる場所に配置しないでください。そうしないと、PHP スクリプトをアップロードしてサーバー上で実行できてしまいます。
の値を$_FILES
出力すると、何が起こっているかについてのヒントを得ることができます。例えば:
配列
(
[ユーザーファイル] => 配列
(
[名前] => ファイル名.拡張子
[タイプ] =>
[tmp_name] =>
[エラー] => 2
[サイズ] => 0
)
)
この構造は、ファイルの名前、MIME タイプ、サイズ、およびエラー コードに関する情報を提供します。
エラーコード
0 エラーがなく、ファイルが正常にアップロードされた
ことを示します。 1 ファイルが php.ini で定義された最大ファイル サイズを超えていることを示します。最大ファイル サイズを変更する場合は、php.ini ファイルを開き、次の行を特定する必要があり
ます。
3 ファイルが部分的にしかアップロードされていないことを示します
4 ファイルが指定されていないことを示します (空のファイル フィールド)
5 まだ定義されていません
6 一時フォルダーがないことを示します
7 を示しますファイルをディスクに書き込めないこと
php.ini
構成
大きなファイルでこのセットアップを実行すると、エラーが発生する場合があります。php.ini
ファイルで次のキーを確認します。
max_execution_time = 30
upload_max_filesize = 2M
必要に応じてこれらの値を増やすと役立つ場合があります。Apache を使用している場合、このファイルを変更するには再起動が必要です。
memory_limit
ファイルはアップロード時に tmp ディレクトリに書き込まれるため、許容最大メモリ値 ( で設定) はここでは関係ありません。tmp ディレクトリの場所は、オプションで を介して制御されupload_tmp_dir
ます。
ファイルの MIME タイプの確認
ユーザーがアップロードしているファイルの種類を確認する必要があります。ベスト プラクティスは、許可されているファイルの種類のリストに対して検証することです。ファイルを許可することの潜在的なリスクは、ユーザーが PHP コードをサーバーにアップロードして実行できる可能性があることです。
MIME タイプを検証するには、非常に便利なfileinfo
拡張機能 (古い関数に取って代わるもの) を使用できます。mime_content_type
// FILEINFO_MIME set to return MIME types, will return string of info otherwise
$fileinfo = new finfo(FILEINFO_MIME);
$file = $fileinfo->file($_FILE['filename']);
$allowed_types = array('image/jpeg', 'image/png');
if(!in_array($file, $allowed_types))
{
die('Files of type' . $file . ' are not allowed to be uploaded.');
}
// Continue
詳しくは
PHP.net のマニュアルで、ファイルのアップロードの処理について詳しく読むことができます。
PHP 5.3 以降の場合
//For those who are using PHP 5.3, the code varies.
$fileinfo = new finfo(FILEINFO_MIME_TYPE);
$file = $fileinfo->file($_FILE['filename']['tmp_name']);
$allowed_types = array('image/jpeg', 'image/png');
if(!in_array($file, $allowed_types))
{
die('Files of type' . $file . ' are not allowed to be uploaded.');
}
// Continue
詳しくは
FILEINFO_MIME_TYPE の詳細については、PHP.net のドキュメントを参照してください。