【问题标题】:PHP input stream returning 0 data - LaravelPHP输入流返回0数据 - Laravel
【发布时间】:2014-02-18 02:26:12
【问题描述】:

我正在尝试在我的 Laravel 4 项目中的表单上进行分块上传。到目前为止,客户端位工作,上传以 2MB 块进行分块,并且正在从浏览器发送数据。甚至还有一个方便的进度条来显示上传进度。

问题出在 PHP 端,因为我无法将上传流的内容写入磁盘。系统总是以创建一个 0 字节的文件结束。这个想法是在它们到达时将块附加到已经上传的文件中。

该项目是基于 Laravel 4 构建的,所以我不确定 Laravel 是否会读取 php://input 流并对其进行处理。由于 php://input 只能读取一次,这可能意味着当我的控制器实际尝试读取流时,它会是空的。

控制器如下所示:

public function upload()
{
    $filename = Config::get('tms.upload_path') . Input::file('file')->getClientOriginalName();
    file_put_contents($filename, fopen('php://input', 'r'), FILE_APPEND);
}

正在创建文件,但它的长度始终保持为 0 字节。有什么想法可以将 php://input 流的内容引出系统吗?

【问题讨论】:

    标签: php file-upload stream laravel laravel-4


    【解决方案1】:

    afaik fopen 返回一个指向文件的指针,而不是一个流,所以它可能不适合作为 file_put_contents 的参数

    您可以尝试使用此解决方法,而不是您的 file_put_contents 吗?

    $putdata = fopen("php://input", "r");
    
    $fp = fopen($filename, "a");
    
    while ($data = fread($putdata, 1024))
      fwrite($fp, $data);
    
    fclose($fp);
    fclose($putdata);
    

    【讨论】:

    • 无论我怎么尝试,你的例子中的 $putdata 总是包含 ''
    • 但在我的示例中,putdata 是指向文件的指针,而不是字符串。这就是我使用while循环的原因。如果您想获得输入的内容,请使用$string= file_get_contents("php://input");,或者如果您像我的示例中那样操作,并且除了将其写入文件之外还想检查内容,请使用while ($data = fread($putdata, 1024)){ $string.=$data; fwrite($fp, $data); }
    • 肯定它不适用于 multipart/form-data。但是,您正在使用 multipart/form-data 并在 post 请求的正文中发送内容?
    • 如果内容在帖子的原始正文中,您可以使用 $HTTP_RAW_POST_DATA 但它也不适用于 multipart/form-data。所以可能最好是在上传器中将其关闭
    • 另外,如果你想使用 multipart/form-data,你可以将数据块分配给一个变量,这样你就可以在普通的 $_POST 数组中检索它们
    【解决方案2】:

    答案很简单,我需要关闭 multipart/form-data 并使用file_get_contents("php://input") 读取内容并将结果传递给file_put_contents(),如下所示:

    file_put_contents($filename, file_get_contents("php://input"), FILE_APPEND);
    

    这可以解决我的问题。

    【讨论】:

      猜你喜欢
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 2017-06-28
      • 1970-01-01
      • 2020-10-18
      • 2018-07-06
      • 2019-10-13
      相关资源
      最近更新 更多