所以我希望用户能够上传大文件,而不必担心帖子的最大大小值。另一种方法是使用 PUT 并将文件作为原始数据发送。使用 jquery 时,我可以这样做:
var data = new FormData();
jQuery.each($('#file_upload')[0].files, function(i, file) {
data.append('file-'+i, file);
});
$.ajax({
url: 'upload.php?filename=test.pdf',
data: data,
cache: false,
contentType: false,
processData: false,
type: 'PUT',
});
在 PHP 中,我可以这样做:
$f = fopen($_GET['filename'], "w");
$s = fopen("php://input", "r");
while($kb = fread($s, 1024))
{
fwrite($f, $kb, 1024);
}
fclose($f);
fclose($s);
Header("HTTP/1.1 201 Created");
我没有做:
$client_data = file_get_contents("php://input");
由于将整个文件放入变量中肯定会在上传大文件时填满所有内存。
我无法弄清楚的是如何在没有表单边界的情况下写入文件数据。现在它在文件顶部写了这样的内容:
------WebKitFormBoundaryVz0ZGHLGxBOCUVQG
Content-Disposition: form-data; name="file-0"; filename="somename.pdf"
Content-Type: application/pdf
在底部是这样的:
------WebKitFormBoundaryVz0ZGHLGxBOCUVQG--
所以我需要解析数据。但为此,我需要将整个数据流读入内存,并且对于大型视频文件,我不想这样做。我确实读过一些关于可能创建 php://temp 流的内容。但还没有运气。如何在没有边界标题的情况下仅将内容写入文件?并且没有先将所有数据注入变量?