0

我正在尝试使用 Jquery 的 PUT 请求将 CHUNKS 中的文件上传到 PHP 服务器。我已经创建了可以上传块文件的代码。但是当我尝试使用“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://input 在同时接收多个请求时如何工作.. 数据是否被覆盖或数据在 STDIN 中被排队?

4

2 回答 2

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");
    }
}
于 2014-07-28T07:11:19.503 回答
0

在你写之前,使用 fseek 来确保你正在写到文件的末尾。

于 2013-05-08T20:56:17.537 回答