使用PUT请求上传多个文件上载

时间:2013-05-08 19:29:43

标签: php

我正在尝试使用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?

2 个答案:

答案 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");
    }
}