【问题标题】:Save large files from php stdin从 php stdin 保存大文件
【发布时间】:2012-12-20 17:06:12
【问题描述】:

请告诉我从 php stdin 保存大文件的最佳方法。 iOS 开发人员将大型视频内容发送到服务器,我必须将其存储到文件中。

我用视频数据读取标准输入线程并将其写入文件。比如这样:

$handle = fopen("php://input", "rb");    
while (!feof($handle)) {
      $http_raw_post_data .= fread($handle, 8192);
}

什么功能更好用? file_get_contents 或 fread 还是别的什么?

【问题讨论】:

  • 如果您可以影响上传过程,我建议您将其作为多部分表单数据发送。它可以通过 $_FILES 以这种方式使用,并且 Web 服务器本身将处理文件的上传并将其保存到文件系统。期待这是最高效的方式。
  • hek2mgl,感谢您的回答。将来我们会尝试使用 mime 功能重新制作上传过程,但现在我们希望这样做。

标签: php post stream


【解决方案1】:

如果您使用 nginx 作为网络服务器,我想推荐 nginx upload module 并有可能恢复上传。

【讨论】:

    【解决方案2】:

    我同意@hek2mgl 的观点,将其视为多部分表单上传最有意义,但如果您无法更改输入界面,则可以在流上使用file_put_contents(),而不是自己循环文件。

    $handle = fopen("php://input", "rb");  
    if (false === file_put_contents("outputfile.dat", $handle))
    {
      // handle error
    }
    fclose($handle);
    

    它比遍历文件更干净,而且可能更快(我没有测试过)。

    【讨论】:

      【解决方案3】:

      不要使用file_get_contents,因为它会尝试将文件的所有内容加载到字符串中

      FROM PHP DOC

      file_get_contents() 是将文件内容读入字符串的首选方式。如果您的操作系统支持,它将使用内存映射技术来提高性能。

      我确定你只是想在你的服务器上创建电影文件..这是一种更有效的方式

      $in = fopen("php://input", "rb");
      $out = fopen('largefile.dat', 'w');
      
      while ( ! feof($in) ) {
          fwrite($out, fread($in, 8192));
      }
      

      【讨论】:

      • 感谢您的解释。
      猜你喜欢
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 2010-12-17
      相关资源
      最近更新 更多