用于上传图片的php脚本无效

时间:2013-05-08 19:17:44

标签: php mysql image-uploading

我有一个编辑页面,允许用户使用表单上传个人资料图片 但问题是我不断接受格式是不可接受的,即使图像类型是可接受的格式之一。

这是代码

if(isset($_POST['parse_var']) == "pic")
    {
        if(!$_FILES['fileField']['tmp_name'])
        {
            $errorMSG = '<font color= "#FF0000">Please browse for an Image  Before you press the button.</font>';
        }
        else
        {
            $maxfilesize = 51200;//in bytes =  50kb
            if($_FILES['fileField']['size']>$maxfilesize)
            {
                $errorMSG = '<font color="#FF0000">Your image was too large, please try again.</font>';
                unlink($_FILES['fileField']['tmp_name']);
            }
            elseif(!preg_match("^.(gif|jpg|png)$/i^",$_FILES['fileField']['name']))
            {
                $errorMSG = '<font color="#FF0000">Your Image was not one of the accepted format, please try again</font>';
                unlink($_FILES['fileField']['tmp_name']);
            }
            else
            {
                $newname = "image01.jpg";
                $place_file = move_uploaded_file($_FILES['fileField']['tmp_name'],"members/$id/".$newname);
                $message='<font color="#00FF00>Your Image has been upload successfully</font>';
            }
        }//end else

    }//end if

1 个答案:

答案 0 :(得分:4)

主要问题:

A)

        elseif(!preg_match("^.(gif|jpg|png)$/i^",$_FILES['fileField']['name']))
                            ^---

你不应该使用正则表达式metachar作为模式分隔符。尝试

preg_match('/\.(gif|jpg|png)$/i', ...) instead.

但是从更大的图片来看,你根本不应该匹配文件名。文件名可以伪造。您应该进行服务器端MIME类型确定(例如,通过file_info())。

b)中

您没有正确检查上传成功。 $ _FILES数组中存在['tmp_name']表示没有。失败的上传可以STILL产生一个tmp_name,但你最终得到垃圾。总是使用这样的东西:

if ($_FILES['fileField']['error'] !== UPLOAD_ERR_OK) {
   die("Upload failed with error code " . $_FILES['fileField']['error']);
}

错误代码在此处定义:http://php.net/manual/en/features.file-upload.errors.php

c)(次要)

您无需取消链接临时文件。当脚本退出时,PHP会自动执行此操作。

d)(风格上巨大的错误)

字体标签?在2013年? 20世纪90年代呼吁并希望他们的HTML 1.0回归......