[问题是本地问题。我将代码上传到学校的服务器,代码每次都有效。感谢你们的所有答案和时间,他们帮助我清理代码,现在看起来更好。]
我的PHP代码上传不会上传所有文件,只会上传一些文件
我的设置页面设置为4个上传框。我的index.php
工作正常,它会将所有4 $_FILES
个信息发送到upload.php
,但当upload.php
获取时,它只上传2个或1个文件,有时全部4个但不会所有文件一直都在。
我已经检查过,foreach loop
工作正常。
这是我的代码:
的index.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form method="POST" action="upload.php" enctype="multipart/form-data">
<?php
$RawSettings= file_get_contents('settings.txt');
$settings = explode('=', $RawSettings);
for ($x=1;$x<="$settings[1]";$x++)
{
echo '<input type="file" name="image'.$x.'"> <br>';
echo $x.'<br>';
}
?>
<input type="submit" value="Upload">
</form>
</body>
</html>
upload.php的
<?php
$x=1;
foreach($_FILES as $image) {
$varname = $_FILES['image'.$x]['tmp_name'];
$vartype = $_FILES['image'.$x]['type'];
$type = explode('/', $vartype);
if ($type[1] == 'jpeg' || $type[1] == 'png')
{
$name = uniqid('picture');
move_uploaded_file($varname, 'uploads/' . $name . '.' . $type[1] );
}
echo $x . '<br>';
echo $varname . '<br>';
$x++;
}
提前感谢您至少阅读我的问题。这些文件具有调试回声,只是为了查看循环是否正常工作。
EDIT2
这是print_r($type)
1
C:\xampp\tmp\php253.tmp
Array
(
[0] => image
[1] => jpeg
)
2
C:\xampp\tmp\php264.tmp
Array
(
[0] => image
[1] => jpeg
)
3
C:\xampp\tmp\php275.tmp
Array
(
[0] => image
[1] => jpeg
)
4
C:\xampp\tmp\php276.tmp
Array
(
[0] => image
[1] => jpeg
)
答案 0 :(得分:1)
foreach($_FILES as $image) {
$varname = $image['tmp_name'];
$vartype = $image['type'];
$type = explode('/', $vartype);
if ($type[1] == 'jpeg' || $type[1] == 'png') {
$name = uniqid('picture');
move_uploaded_file($varname, 'uploads/' . $name . '.' . $type[1] );
}
}
希望它能帮到你
答案 1 :(得分:0)
首先,您不需要$x
中的foreach
,因为$image
已填充$_FILES["image".numer]
。如果您想检查密钥是否以图片开头,您可以使用strpos($key, 'image') === 0
。
您可能发送的文件的起始名称不是“image”,在这种情况下$x
将递增,如果发送4个非图像文件,PHP将尝试读取不存在的文件$_FILES["image5"]
这是检查文件类型的更安全的方法:
$finfo = new finfo(FILEINFO_MIME);
$mimetype = $finfo->file($image['tmp_name']);
但这只适用于PHP&gt; = 5.3.0
你应该使用$ image ['tmp_name']而不是$_FILES["image".$x]["tmp_name"]
。
foreach($_FILES as $key => $image){
if(strpos($key, 'image') !== 0) continue; //Check if "image" is at the beggining of the key
$varname = $image['tmp_name']; //Get the temp name
$finfo = new finfo(FILEINFO_MIME); //Make an instance of the finfo class with mime mode
$vartype = $finfo->file($image['tmp_name']);//Get mimetype of tmp_name
$type = explode('/', $vartype);
if (substr($type[1], 0, 4) == 'jpeg' || substr($type[1], 0, 3) == 'png')
{
$name = uniqid('picture');
move_uploaded_file($varname, 'uploads/' . $name . '.' . $type[1].'NOPHP');
}
//echo $varname . '<br>';
}
另外,使用explode('=', $RawSettings)
,您只能加载一个设置,并且,如评论者所述,您应该从$x<="$settings[1]
“删除doule引号。