ユーザーが複数の画像をアップロードできるフォームがあり、各画像の上限は 2MB です。フォームが送信されると、画像はサーバー (この場合は私のコンピューター) に保存されます。
問題 複数のファイルをアップロードする場合、アップロードされた最初の画像は常にサーバーへのアップロードに失敗しますが、他の画像 (例: 2 番目、3 番目など) はコンピュータに正常に保存できます.1つの画像、画像もアップロードに失敗します。
フォームから送信された最初の画像は常にアップロードに失敗すると結論付けましたが、画像ファイルの tmp_name を正常にエコーできるため、その理由がわかりません。
マイコード(抜粋):
if(isset($_FILES['upload']['tmp_name']))
{
$numfile=count($_FILES['upload']['tmp_name']);
for($i=0;$i<$numfile;$i++)
{
if(!empty($_FILES['upload']['tmp_name'][$i]))
{
if(is_uploaded_file($_FILES['upload']['tmp_name'][$i]))
{
//Conditionals for uploaded file
$foldername=$_SESSION['UserId'];
$cat=$_POST['category'];
$sub=$_POST['subcat'];
$itemname=$_POST['itemname'];
$allowed_filetypes=array('.jpg','.gif','.bmp','.png','.JPG');
$max_filesize = 2097152; // Maximum filesize in BYTES (currently 2.0MB).
$upload_path = 'C:\Users\Kence\Desktop\UniServer\www\images\\'.$foldername.'\\'.$cat.'\\'.$sub.'\\'.$itemname.'\\'; // The place the files will be uploaded to.
//Checks if Folder for User exists
//If not, A folder for the user is created to store the user's images
if(!is_dir($upload_path))
{
$upload_path=mkdir($upload_path,0644,true);
}
$filename = $_FILES['upload']['name'][$i]; // Get the name of the file (including file extension).
$ext = substr($filename, strpos($filename,'.'), strlen($filename)-1); // Get the extension from the filename.
// Check if the filetype is allowed, if not DIE and inform the user.
if(in_array($ext,$allowed_filetypes))
{
if(filesize($_FILES['upload']['tmp_name'][$i])<$max_filesize)
{
if(is_writable($upload_path))
{echo"$upload_path <br>";
print_r($_FILES);
if(!move_uploaded_file($_FILES['upload']['tmp_name'][$i],"$upload_path" . $filename))
{
$errormsg="Upload Failed.Error in moving file";
}
}
else
{
$errormsg="Image Upload Failed.";
}
}
else
{
$errormsg="Upload failed.ONly images below 2MB are allowed";
}
}
else
{
$errormsg="Error. Only JPEG,PNG and BMP files are allowed";
}
}
else
{
$errormsg="Error.File not uploaded";
}
}
}
}
else
{
$errormsg="Upload failed";
}
エラー メッセージ エラー メッセージ が表示されます
Error.ファイルがアップロードされていません
フォームコード:
<body onload="getcategory()">
<form action="<?PHP echo $_SERVER['PHP_SELF'] ?>" name="additem" enctype="multipart/form-data" method="POST">
<table>
<tr>
<td>Select Category: </td><td>
<select name="category" id="category" onchange="getsubcategory(this)">
<option disabled="disabled" value="">Choose a category</option>
</select>
</td>
</tr>
<tr>
<td>Select SubCategory</td>
<td>
<select id="subcat" name="subcat">
<option value=""></option>
</select>
</td>
</tr>
<tr>
<td>Item Name</td>
<td><input type="text" name="itemname" size="30" maxlength="50" required="required"></td>
</tr>
<tr>
<td>Item Price</td>
<td><input type="number" name="itemprice" size="30" min="1" required="required"></td>
</tr>
<tr>
<td>Item Info</td>
<td><textarea name="iteminfo" col="40" rows="10" maxlength="300" required="required"></textarea>
</tr>
<tr>
<td>Filename:</td>
<td><input type="file" name="upload[]" /></td>
</tr>
<tr>
<td>Filename:</td>
<td><input type="file" name="upload[]" /></td>
</tr>
<tr>
<td>Filename:</td>
<td><input type="file" name="upload[]" /></td>
</tr>
<tr>
<td>Filename:</td>
<td><input type="file" name="upload[]" /></td>
</tr>
<tr>
<td>Filename:</td>
<td><input type="file" name="upload[]" /></td>
</tr>
<tr>
<td colspan="2"><input type="SUBMIT" name="Button" value="Submit"></td>
</tr>
<tr>
<td colspan="2"><?PHP if(isset($errormsg)){echo"$errormsg";}?></td>
</tr>
<tr>
<td colspan="3"><font color="#FF0000"></font></td>
</tr>
私はできますが、アップロードしようとしているすべての画像が正常に表示されますprint_r ($_FILES)
。tmp_name
編集 手順の実行/ 試行 tmp_name のアップロードのみが処理されるように、if(!empty) チェックを追加しました。したがって、空のアップロードは無視され、エラーが削除されます (Sven の親切な助けに感謝します)。
Error.File not uploaded
ただし、それでも、フォームに送信された最初の画像は保存されません(つまり、画像を 1 つだけアップロードした場合、エラーなしで失敗した場合、複数の画像をアップロードした場合、最初の画像のみが保存されません残りは正常に保存されますが、アップロードされます。)ただし、ページを更新すると(同じフォームを再送信すると)、最初の画像が保存されます。
ここでの問題は、ファイル パスが書き込み可能ではないため、最初の画像が保存されないことです。ただし、最初の画像のファイル パスが書き込み可能でない場合、なぜ後続の画像に有効なファイルがあるのか ということです。パス、同じコードで実行されているときは? また、ページを更新すると (フォームを再送信すると)、魔法のように最初の画像が正常に保存されるのはなぜですか (これは、ファイル パスが書き込み可能になったことを意味します)。
私の print_r($_FILES); の結果
Array (
[upload] => Array (
[name] => Array (
[0] => download (1).jpg
[1] => download.jpg
[2] =>
[3] =>
[4] =>
)
[type] => Array (
[0] => image/jpeg
[1] => image/jpeg
[2] =>
[3] =>
[4] =>
)
[tmp_name] => Array (
[0] => C:\Users\Kence\Desktop\UniServer\tmp\php474.tmp
[1] => C:\Users\Kence\Desktop\UniServer\tmp\php475.tmp
[2] =>
[3] =>
[4] =>
)
[error] => Array (
[0] => 0
[1] => 0
[2] => 4
[3] => 4
[4] => 4
)
[size] => Array (
[0] => 6229
[1] => 6984
[2] => 0
[3] => 0
[4] => 0
)
)
)
誰かがどこで何を間違っているか指摘できますか? 私は過去3時間試してきましたが、何が間違っているのかまだわかりません。
編集:解決済み
私の間違いを理解しました。
もともと書いた
if(!is_dir($upload_path))
{
$upload_path=mkdir($upload_path,0644,true);
}
そして私はそれをに変更しました
if(!is_dir($upload_path))
{
mkdir($upload_path,0644,true);
}
私が得ていたエラーを解決しました。私の側の本当にばかげた間違い