我正在尝试构建一个简单的图片上传,但是当我尝试上传任何图片时,我收到错误,告诉我文件无效。谁能告诉我我做错了什么?
这是我的代码:
<?php
$allowExts = array("jpg", "jpeg", "gif", "png", "stl");
$extensions = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/stl"))
&& ($_FILES["file"]["size"] < 21000)
&& in_array($extension, $allowExts))
{
if ($_FILES ["file"]["error"] > 0){
echo "ERROR: " . $_FILES["file"]["error"] . "<br>";
}
else{
echo "Upload: " . $_FILES["file"]["name"];
echo "Type: " . $_FILES["file"]["type"];
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "Stores in: " . $_FILES["file"]["tmp_name"];
if (file_exists("upload/" . $_FILES["file"]["name"])){
echo $FILES["file"]["name"] . "already exists. ";
}
else{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $FILES["file"]["name"];
}
}
}
else{
echo "Invalid File";
}
?>
以下是根据我所做的修改调整后的文件:
<?php
$allowExts = array("jpg", "jpeg", "gif", "png", "stl");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/stl"))
&& ($_FILES["file"]["size"] < 30000000)
&& in_array($extension, $allowExts))
{
if ($_FILES ["file"]["error"] > 0){
echo "ERROR: " . $_FILES["file"]["error"] . "<br>";
}
else{
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "Stores in: " . $_FILES["file"]["tmp_name"] . "<br>";
if (file_exists("images/" . $_FILES["file"]["name"])){
echo $FILES["file"]["name"] . "already exists. ";
}
else{
move_uploaded_file($_FILES["file"]["tmp_name"],
"images/" . $FILES["file"]["name"]);
echo "Stored in: " . "images/" . $FILES["file"]["name"];
}
}
}
else{
echo "Invalid File";
print_r($_FILES);
}
?>
答案 0 :(得分:2)
有一个拼写错误的“扩展名”和“扩展名”。如果已修复,请使用is_uploaded_file
检查您的文件。
in_array($extension, $allowExts)
必须为in_array($extensions, $allowExts)
或将$extensions
命名为$extension
。
您必须使用$extension[1]
答案 1 :(得分:1)
让我们简单一点吧; HTML应如下所示:
<form method='POST' action="upload.php" enctype="multipart/form-data" >
<input type="file" name="userfile" id="userfile" />
<input type="submit" value="upload" />
</form>
你的PHP,试试这个:
<?php
//GRAB IMAGE FROM POST
$pic = $_FILES['userfile'];
$picName = $_FILES['userfile']['name'];
$file_ext = strtolower(end(explode(".", $picName )));
if($file_ext == "jpg" || $file_ext == "jpeg" || $file_ext == "gif" || $file_ext == "png" ){
//MAKE SURE YOU HAVE CHMOD 777 THIS DIRECTORY AND DOUBLE CHECK THIS IS THE CORRRECT DIRECTORY!
$theDirectory = 'upload/theImage.'.$file_ext;
//MOVE THE FILE TO THIS DIRECTORY
move_uploaded_file($pic['tmp_name'], $theDirectory);
}
else{
echo 'bad file';
}
?>
验证文件有点麻烦,但它可以解决问题。确保将php文件命名为upload.php
或任何你想要的名称,只需确保更改html上的form
即可。确保你将文件夹"upload"
chmod到777.这样做应该无限期地工作。我总是觉得最好让它工作,然后回去开展安全工作。例如,您应该使用GD库通过执行类似的操作来验证它是合法的图像(这个位可能需要调整):
//MAKE IT A JPEG
$theDirectoryTwo = 'upload/theImageValidated.jpg';
$theRawImage = file_get_contents($theDirectory);
$theRawImage = imagecreatefromstring($theRawImage);
imagejpeg($theRawImage, $theDirectoryTwo);
除非有人试图将文本文件命名为“anImage.jpg”,否则每次运行都会产生完美的jpeg,上面的位会产生一个黑色的图像。只需要安装GD库就可以了。
科西嘉总是存在可怕的Chmod 777安全风险,只要只上传文件进入那里,你应该没问题,没有任何问题。
答案 2 :(得分:0)
从评论中我可以看到您上传的文件超出了大小限制。不同操作系统的实际文件大小可能略有不同,因此请务必使用足够大的限制。
创建一个文件验证函数可能是值得的,该函数执行每个单独的检查(类型,大小,扩展名)并让它返回更有细节的有意义的错误,例如无效扩展,无效类型等。这将使它更容易将来调试。