PHP上传文件过滤


PHP Upload file filtering

我正在尝试编写一个上传脚本,该脚本在上传时只接受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图像时,我会收到"不是PNG"的错误——有什么想法吗?

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

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

应该是

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

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

我看到一些服务器没有在$_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);
  }
  1. 切勿将$_FILES[...]['type']用于任何用途。它只是一个任意的、用户提供的字符串,可能与实际文件有关,也可能与实际的文件无关
  2. 因此,请自己检查MIME类型
  3. 启用error_reporting(E_ALL); ini_set('display_errors', true);,这将帮助您查找特定的拼写错误
  4. 习惯早期失败

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');
    }
    ...
}