【问题标题】:php://input fails with large filesphp://input 因大文件而失败
【发布时间】:2012-04-22 14:24:23
【问题描述】:

我正在使用带有 ajax 和 PHP 的上传脚本,它对小于 80MB 的文件效果很好。但是,如果文件大于 80MB,则会失败,甚至根本不会输出任何内容。

代码是:

$maxsize = getMaxFileSize();
$finalfile = $uploadpath . $finalname;
$putdata = fopen("php://input", "r");
$fp = fopen($finalfile, "w");
$filesizecalc = 0;
while ($data = fread($putdata, 1024)) {
    fwrite($fp, $data);
    $filesizecalc = $filesizecalc + 1024;
}

fclose($fp);
fclose($putdata);
if ($filesizecalc <= $maxsize) {
    addFile($_SESSION['userdata']['userid'], $finalname);
    echo "$fn uploaded";
} else {
    unlink($finalfile);
}
exit();

这适用于几乎所有

error_reporting(E_ALL | E_NOTICE);
ini_set('display_errors', 1);
ini_set('memory_limit', '1024M');
ini_set('upload_max_filesize', '1024M');
ini_set('post_max_size', '1024M');
ini_set('max_input_time', 10000);
ini_set('max_execution_time', 10000);

【问题讨论】:

  • 在 ini_set 之后运行 php_info()。通常upload_max_filesize不能用ini_set设置
  • 你是对的,它不是用 ini_set 设置的。但是,它被主机设置为100M,对于一个99MB的文件来说应该足够了,对吧?还有,max_input_time设置为60,是不是也太低了?
  • 我会说上传 99MB 文件和 100MB 限制是有风险的 - 你应该为标头、控制数据包等多花约 10%。60 秒内 100MB 是 1.7mb/s 上传速度(13.5Mb上传链接)。可能还不够
  • 我的主机刚刚将upload_max_filesize 增加到1024,将max_input_time 增加到3600,但仍然无法正常工作。这很奇怪:\
  • 签入 apache error_log 文件

标签: php file-upload upload


【解决方案1】:

让我们把它写下来作为解决方案,这样它就可以被正确读取,而不是在 cmets 中挖掘。

  • 在 ini_set 命令之后检查您的 php_info(),一些配置 变量不能从脚本中改变,有 ~ 6 种不同 控制大上传的值。检查所有这些(列表和 例子可以找到here)
  • 签入apache error_log 文件以获取真正的错误。 (或检查 access_log 以查看 服务器返回的请求状态是什么)
  • 可能有 一些限制请求的应用程序防火墙或 apache 配置 时间。在这种情况下,您将看到响应代码,例如“连接 重置”。

试试W3Scools upload script

<?php
if (true)
  {
  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 />";

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

【讨论】:

  • 好的,我已经检查了所有内容,但仍然失败。所有配置变量都设置为巨大的值,error_log 文件是干净的,access_log 总是显示 OK 200。我在这里迷路了:\
  • 您能否上传访问日志的最后几行。最后一个参数应该是响应大小。你也可以放几个“echo”命令,看看脚本能走多远。顺便说一句,如果您上传小文件会怎样?试试我添加的脚本。
  • 如果我在 php://input 中获取文件,我可以使用该脚本吗?
  • 我认为您不需要为此使用 php 输入流。无论如何都是尝试解决问题的好方法。
猜你喜欢
  • 1970-01-01
  • 2018-10-27
  • 2013-04-22
  • 2014-11-17
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
相关资源
最近更新 更多