【问题标题】:file_get_contents('php://input'); returns empty string with large files [duplicate]file_get_contents('php://input');返回带有大文件的空字符串[重复]
【发布时间】:2014-02-11 20:20:12
【问题描述】:

我正在尝试将文件保存在我的服务器上。它适用于小文件,但不适用于大文件。

在 JavaScript 中,我发送带有 XMLHttpRequest 的文件,如下所示

var ajax = new XMLHttpRequest();
ajax.open('POST', configuration.backend + 'ajax/uploadVideo', true);
ajax.setRequestHeader('X-File-Name', input.files[0].name);
ajax.setRequestHeader('X-File-Size', input.files[0].size);
ajax.send(input.files[0]);

在 PHP 中,此脚本将输入保存到硬盘:

$filename = $_SERVER['HTTP_X_FILE_NAME'];
$extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
$new_filename = uniqid().'.'.$extension; 
$fh = fopen(DOCROOT.'/public/videos/'.$new_filename, 'w');
fwrite($fh, file_get_contents('php://input'));
fclose($fh);

该脚本适用于较小的文件,但不适用于较大的文件。它只是创建一个 0 字节的文件。 (8.7MB 不工作,而 5.7MB 工作)。我没有收到任何 PHP 错误。错误报告级别为E_ALL & ~E_DEPRECATED。

我也尝试增加post_max_size、upload_max_filesize和memory_limit的值,但没有任何改变。

【问题讨论】:

  • 原谅我问了这么明显的问题,但是你改了php.ini后有没有重启apache?
  • 我没有看到任何file_get_contents,但我看到了file_put_contents。 put 是问题所在,是吗?
  • 我在想 upload_max_filesize 不能用 ini_set() 改变。
  • 快速提问,当脚本从 ajax 触发时,你怎么知道你有任何错误,但我没有看到任何处理错误响应的东西?您是否检查了inspector 中的network 选项卡以查看返回的response code 是什么?要回答上述问题,只需echo ini_get('upload_max_filesize');
  • @Ohgodwhy 听起来 OP 正在使用他们自己的服务器

标签: javascript php


【解决方案1】:

刚刚发现错误。更改 php.ini(不仅仅是 ini_set())是 post_max_size,而不是 upload_max_filesize。

【讨论】:

    【解决方案2】:

    快速浏览后,查看其他 Stack 答案:

    Changing upload_max_filesize on PHP

    我认为你需要在 php.ini 中调整上传大小并重启 apache,ini_set() 不能用于更改所有 PHP 设置。

    【讨论】:

    • 正确,upload_max_filesize 是 PHP_INI_PERDIR 可更改但链接到另一个 SO 问题/答案,因为您的答案并不酷。将此问题标记为重复问题
    • 对不起,我是这个网站的新手,我不知道我能做到这一点。我的错。
    猜你喜欢
    • 2015-01-24
    • 2015-06-14
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2011-05-09
    • 1970-01-01
    相关资源
    最近更新 更多