我有一个允许用户上传多张图片的表单,每张图片上限为2MB。提交表单后,图像将存储在服务器上(例如,在这种情况下,我的计算机)。
的问题 的 上传多个文件时,上传的第一张图片总是无法上传到服务器,而其他图片(例如第二张,第三张等)可以成功保存到我的电脑上。当只用测试表格时一张图片,图片也无法上传。
我已经得出结论,通过表单提交的第一张图片将始终无法上传,但我无法理解为什么会这样,因为我能够成功回显图像文件的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";
}
错误消息 我收到错误消息
错误。文件未上传
表单代码:
<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
也会成功显示。
修改 采取步骤/尝试 添加了一个if(!empty)检查,以便只处理带有tmp_name的上传。因此忽略了空上载,从而消除了错误(为了他的帮助,为Sven致记)
Error.File not uploaded
然而,即便如此,提交到表单的第一张图片将不保存(即如果我只上传一张图片,如果会失败,没有任何错误,如果我上传多个图像,只有第一个图像不会被上传而其余的图像会被成功保存。)但是,如果我要刷新页面(从而重新提交相同的表格),那么第一个图像将被保存。
这里的问题是文件路径 NOT 可写,导致第一个图像无法保存。但令我困惑的是,如果第一个图像的文件路径不可写,当它们在相同的代码上运行时,为什么后续图像会有一个有效的文件路径?另外,为什么刷新页面(从而重新提交表单)会神奇地让第一张图像成功保存(文件路径现在可以写入?)
我的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);
}
这解决了我得到的错误。我本人真的很愚蠢
答案 0 :(得分:1)
查看您的转储,并与您的代码进行比较。
您的代码访问所有上传字段,即使没有上传文件,例如在字段3,4和5中。因此,您的代码将迭代所有这些文件,并在空字符串上使用realpath()
。
这将触发错误消息&#34; Error.File not uploaded&#34;。这是正确的,因为没有上传文件号3,4和5,它们是空的。
您的代码必须处理此问题。
作为安全功能,请勿使用realpath()
,请使用is_uploaded_file()
。 PHP具有在上载期间创建的文件名列表,并且只允许在上载脚本中处理这些文件。您不希望触及任何其他文件,即使攻击者欺骗PHP操纵&#34; tmp_name&#34;。
答案 1 :(得分:0)
&#34;上传&#34;这里$_FILES['upload']
指的是表单中文件字段的名称
如果上传了名为upload的文件字段中的文件,则只会产生错误
你是否可能以不同的方式命名表格中的第一个上传字段?
答案 2 :(得分:0)
弄清楚我的错误。
我最初写的
if(!is_dir($upload_path))
{
$upload_path=mkdir($upload_path,0644,true);
}
我将其改为
if(!is_dir($upload_path))
{
mkdir($upload_path,0644,true);
}
这解决了我得到的错误。 我真的很愚蠢。