【问题标题】:Invalid File on PHP File UploadPHP 文件上传时文件无效
【发布时间】:2011-08-27 16:24:20
【问题描述】:

我已经建立了一个带有 HTML 表单/PHP 上传图像文件的网站,当它在我的本地计算机上的 XAMPP 上运行时它运行良好,但是当我将它上传到 000webhost 大部分时间它说无效文件和只有有时图像会成功上传。我已经尝试在 php 配置中调高最大执行时间,但这似乎并没有解决它。我尝试上传的文件小于 php 配置中的最大文件大小,并且在我的测试机器上完美运行。

我觉得奇怪的是它有时有效,有时无效,而且我真的不知道该尝试什么。

编辑:

这是表格 文件名:

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/png")))
   {
       if ($_FILES["file"]["error"] > 0)
          {
          echo "Return Code: " . $_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 "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";


          move_uploaded_file($_FILES["file"]["tmp_name"],
          "churchimages/pauls.jpeg");
          echo "Stored in: " . "churchimages/pauls.jpeg";

          }
  }

 else

 {
 echo "Invalid file";//This is the section I am seeing
 }

【问题讨论】:

  • 您需要显示一些源代码和您收到的确切错误消息。
  • but when i've uploaded it to 000webhost most of the time it says invalid file and only sometimes will the images successfully upload. 不一致的行为听起来像是托管问题而不是您的代码...
  • @toopay 和 Pekka 我现在已经添加了我的代码

标签: php file-upload


【解决方案1】:

您的文件类型检测依赖于$_FILES["file"]["type"],由浏览器发送,非常不可靠。

检测上传文件是否为图像的更好方法是getimagesize()

$info = getimagesize($_FILES["file"]["tmp_name"]);

$allowed_types = array(IMG_GIF, IMG_JPEG, IMG_PNG);

if (in_array($info[2], $allowed_types))
 { .... do stuff ... }

【讨论】:

  • 感谢您的帮助,效果很好。我在这里得到了我在 W3 学校使用的代码w3schools.com/php/php_file_upload.asp 我想知道他们为什么不推荐这种方法。
  • 等一下,这还没有修复它,它有时会工作,但有时会显示警告:getimagesize() [function.getimagesize]:文件名不能为空,我猜这意味着有时文件没有在页面之间正确传输
  • 在这种情况下,上传失败。结合使用我和@Marc 的答案来确保图片已上传,并且是一张图片。
  • 我认为在某个时间段内阻止了太多上传,因为我尝试按照您和 Marc 的建议进行操作,但是当我的原始文件说无效文件时,getimagesize 函数中的文件名不能为空
  • 内存限制会导致此错误吗?在我的本地测试服务器上是 128M,但在 000Webhost 上是 64MB,这对图像文件来说会是个问题吗?
【解决方案2】:

在执行任何其他操作之前,您应该首先检查上传是否真的成功:

if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
    ... handle upload...
    if (!move_uploaded_file(...)) { // <--important. ALWAYS check if the move worked.
       die("File move failed. Data is lost");
    }
} else {
   die("Upload failed with code " . $_FILES['file']['error']);
}

如果没有发生上传,则不会设置['type']字段,只是说“无效文件”是没有用的——根本没有文件。

正如 Pekka 所指出的,您应该使用其他方法来确定文件类型。 $_FILES 中的['type'] 数据是用户提供的,很容易伪造。

【讨论】:

  • 感谢您的帮助,我会这样做的
【解决方案3】:

确保为上传的文件定义绝对路径,而不是相对路径。

【讨论】:

    【解决方案4】:

    我今天遇到了这个问题.. 非常难过。修复大约需要一个小时。

    想法:在脚本顶部检查 $_FILES["file"]["type"] == "image/gif" 对我来说失败了。似乎浏览器填充的是“空白数据”而不是“图像/gif”,所以我的初始检查每次都以“无效文件类型”失败

    问题:浏览器似乎没有从 tmp 目录正确发送文件类型?

    我的 FIX: 删除文件类型检查......如上所述,它非常不可靠......

    【讨论】:

      【解决方案5】:

      检查 PHP 文件的权限。在 ooowebhost 中,您可以在 chmod 中找到它。更改为“777”。否则,该文件无权执行/写入

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 2017-01-26
        相关资源
        最近更新 更多