PHP输入流返回0数据 - Laravel

时间:2014-01-27 09:51:40

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

我正在尝试在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://输入流的内容哄骗出系统吗?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

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

这可以解决我的问题。