我正在尝试使用Jquery到PHP服务器使用PUT请求在CHUNKS中上传文件。 我创建了代码,我可以上传块文件。 但是当我尝试使用“php:// input”
读取它时,会发生一些奇怪的事情<?php
$headerArray=getallheaders();
$filename="d/".$headerArray["filename"];
$length=$headerArray["Content-Length"];
/* PUT data comes in on the stdin stream */
echo "filename".$filename;
echo "Chunksize Uploaded:".$length;
$putdata = fopen("php://input", "r");
/* Open a file for writing */
$fp = fopen($filename, "a");
while ($data = fread($putdata, $length))
fwrite($fp, $data);
/* Close the streams */
fclose($fp);
fclose($putdata);
echo "FileSize After write : ".filesize($filename);
?>
在这里,当我逐个发送每个块并等待代码将该块写入文件时,我能够成功地以块的形式上传文件。
但是当我进行并发上传时(不要等待第一个块写入文件中)。“php:// input”中的数据似乎被下一个请求覆盖了。
我已经检查了javascript。所以问题是在php结束时“我该怎么读CHUNKS?”。
我已经完成了以下链接和其他几个链接: http://php.net/manual/en/features.file-upload.put-method.php
当有人同时收到多个请求时,有人可以帮助我理解php://输入是如何工作的......数据是否被覆盖或数据在STDIN中获得QUEUED?
答案 0 :(得分:0)
在编写之前,请使用fseek确保写入文件的末尾。
答案 1 :(得分:0)
尝试在JS-Objects中将多个上传作为Blob-Parts发送。这需要在服务器上使用简单的序列化算法,例如Perl:
sub init{
my $self = shift;
# AJAX Response
if($ENV{REQUEST_METHOD} eq 'PUT'){
# Objekte wiederherstellen aus STDIN
binmode STDIN;
my $eav = EAVHandle->handle2eav(*STDIN);
# $eav ermöglicht den wahlfreien Zugriff auf die Einzelteile
# für die DEMO schicken wir die Objekte wieder zurück
$self->{CONTENT} = EAVHandle->eav2str($eav);
$self->header("Content-Type" => "application/octet-stream");
}
}