2013-05-08 205 views
0

我想在使用JQUERY的PUT請求到PHP服務器的CHUNKS上傳文件。 我已經創建了可以上傳塊文件的代碼。使用PUT請求上傳多個文件上傳

<?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」它 但奇怪的事情是happenening代碼將該塊寫入文件。

但是,當我做併發上傳(不要等待第一個塊被寫入文件)..「php://輸入」中的數據似乎被下一個請求覆蓋。

我有doble檢查的JavaScript。所以問題是在PHP結束「我應該怎麼讀CHUNKS?」。

我已經通過以下鏈接等幾個環節了: http://php.net/manual/en/features.file-upload.put-method.php

有人可以幫助我瞭解如何PHP://輸入工作,當它收到
在同一時間多個請求..沒有數據被覆蓋或者數據在STDIN中被排隊?

+0

你好Kunal ...這聽起來對我來說真的很奇怪。 Regulary STDIN不應該在多個請求之間共享(因爲這會導致完全混淆) – hek2mgl 2013-05-11 18:40:29

回答

0

在編寫之前,請使用fseek確保您正在寫入文件末尾。

+0

正如你所看到的,我已經使用append模式來寫入文件,這將自動尋找文件結尾,然後它會寫入它。 – 2013-05-09 18:39:07

0

嘗試在JS對象中發送多個上傳爲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"); 
    } 
}