PHP上传文件过滤

时间:2012-01-07 22:44:19

标签: php html upload

我正在尝试编写一个只在上传时接受PNG图像的上传脚本。上传脚本工作正常但是当我添加png图像检测时,它会中断。

以下是我设置的方法:

if ($_FILES) {

        if ($_FILES["file"]["type"] == "image/png") {

        $target_path = "uploads/";
        $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 

        if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
            echo "The file ".  basename( $_FILES['uploadedfile']['name']). 
            " has been uploaded";
        } else{
            echo "There was an error uploading the file, please try again!";
        }

        } else { echo "Not A PNG…";

        }

    }

当我上传PNG图片时,我收到'not a png'错误 - 任何想法?

3 个答案:

答案 0 :(得分:3)

看起来您在IF语句中引用了错误的文件:

if ($_FILES["file"]["type"] == "image/png") {

应该是

if ($_FILES["uploadedfile"]["type"] == "image/png") {

("文件"需要"上传文件")

答案 1 :(得分:2)

我看到有些服务器没有在$ _FILES变量中添加mime类型的image / png ......有一点点CPU重的方式:

if (@imagecreatefrompng($_FILES["file"]["tmp_name"])

当您使用GD库打开图像画布时,此处的性能会略微降低

如果GD库的性能或缺乏是一个问题,只需检查扩展名:

if (strtolower(end(explode('.',$_FILES["file"]["name"])) == 'png')

注意 如果您想使用imagecreatefrompng功能,建议确保安装GD:if (function_exists('imagecreatefrompng'))


重要 如果你对内存使用情况保持谨慎(你应该这样做)

if ($image = @imagecreatefrompng($_FILES["file"]["tmp_name"]) {
  // Do something
  imagedestroy($image);
  }

答案 2 :(得分:2)

  1. 永远不要使用$_FILES[...]['type']。它只是一个任意的,用户提供的字符串,可能与实际文件有关,也可能没有。
  2. 因此,请自行检查MIME类型。
  3. 启用error_reporting(E_ALL); ini_set('display_errors', true);,这有助于您找到特定的拼写错误。
  4. 习惯早早失败
  5. 2和4的示例:

    if (!empty($_FILES['uploadedfile'])) {
        if ($_FILES['uploadedfile']['error'] !== UPLOAD_ERR_OK) {
            die('Error during upload');
        }
        if (exif_imagetype($_FILES['uploadedfile']['tmp_name']) !== IMAGETYPE_PNG) {
            die('Wrong file type');
        }
        ...
    }