2013-02-18 139 views
0

我想构建一个简单的图像上传,但当我试图上传任何图像时,我收到一个错误,告诉我它的一个无效文件。谁能告诉我我做错了什么?图像上传错误

这里是我的代码:

<?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); 
    } 

?> 
+2

尝试:'echo $ _FILES [“file”] [“type”];'看看它是什么类型的文件,以及它是否在你的列表中。 – 2013-02-18 16:37:08

+2

向我们展示'print_r($ _ FILES)'的结果。 – MrCode 2013-02-18 16:37:36

+0

我知道我尝试上传的文件是PNG和JPG,似乎都没有工作,但我有他们在列表中。使用谷歌浏览器,而不是IE或Firefox,其他jpg扩展也需要。 – Giovatto 2013-02-18 16:38:50

回答

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"修改为777.这样做应该无限期地工作。我总是发现最好的方式是让它工作,然后回去继续安全工作。举例来说,你应该使用GD库,以验证它是通过做这样一个合法的图像(该位可能需要调整):

//MAKE IT A JPEG 

$theDirectoryTwo = 'upload/theImageValidated.jpg'; 
$theRawImage = file_get_contents($theDirectory); 
$theRawImage = imagecreatefromstring($theRawImage); 
imagejpeg($theRawImage, $theDirectoryTwo); 

运行要么导致一个完美的JPEG每次除非有人在试图命名一个文本文件来表示喜欢“anImage.jpg”,上面的一点会导致一个黑色的图像。只需要声明GD库已安装。

对于corse来说,总会有可怕的Chmod 777安全风险,只要上传的文件在那里,你应该没问题,没有任何问题。

+1

这工作完美! – Giovatto 2013-02-18 20:00:02

2

没有与“扩展”和“扩展”一个错字。如果修复,请用is_uploaded_file检查您的文件。

in_array($extension, $allowExts)必须是in_array($extensions, $allowExts)或名称$extensions$extension

您必须使用元素1像$extension[1]

+0

我刚刚尝试进行更改,仍然无效。图像将上传到100%,然后给我错误 – Giovatto 2013-02-18 16:50:32

+0

对不起,我的坏,等待,你必须使用$扩展[1]为分机扩展。不好意思,对不起,没有看到'end()' – Patrick 2013-02-18 16:51:03

+0

对不起,我对你的评论有点遗憾,请使用$ extension [1]或者不要? – Giovatto 2013-02-18 16:57:15

0

从意见,我可以看到你已经上传的是上面的大小限制的文件。实际文件大小在不同操作系统中可能会有所不同,因此请务必使用足够大的限制。

这可能是值得创建一个文件验证函数,它会执行每个单独的检查(类型,大小,扩展名),并让它返回更细微的有意义的错误,如无效扩展,无效类型等。这将使它更容易在未来进行调试。

+0

我有提出的大小限制,但它仍然给我相同的警告,我刚刚更新了第二部分。 – Giovatto 2013-02-18 18:05:20

+0

与'uploader.php'具有相同等级的图像吗? – MrCode 2013-02-18 18:36:45