2015-06-10 72 views
0

我一直在顛倒網絡,以獲得分塊大文件上傳爲我的Symfony2應用程序工作。爲了簡化事情,我製作了一個測試程序,與其他應用程序分開。它做的唯一的事情就是試圖測試如果PHP://輸入可以接受我的大文件的上傳與本文中介紹的方法:爲什麼php://輸入拒絕我的大文件上傳?

http://www.webiny.com/blog/2012/05/07/webiny-file-upload-with-html5-and-ajax-using-php-streams/

我的理解是,如果是在用戶上載該大型視頻文件2GB +,然後在服務器上需要2GB + RAM,文章中的方法將其削減到每個併發上傳器4096位。 (我不確定我怎麼會測試本地主機服務器上的RAM使用)

但是當我嘗試上傳大文件瀏覽器只是等待第二個和2個,然後職位1KB的錄像檔案。

我爲php.ini設置設置了很高的值。

這裏是PHP代碼的相關部分:

 public function lastoppAction(Request $request) 
{ 

    $videofilename = (string)$request->request->get("filnavn"); 
    $inputHandler = fopen("php://input", "rb"); 
    $fileHandler = fopen("videoer\\myfile.tmp", "wb") or die('fopen failed');; 

    while(true) { 
$buffer = fgets($inputHandler, 4096); 
if (strlen($buffer) == 0) { 

    fclose($inputHandler); 
    fclose($fileHandler); 
      break; 
} 
fwrite($fileHandler, $buffer) or die('fwrite failed');; 
    } 
    $url = $this->generateUrl('largefile_navngi', array('filnavn' => $videofilename)); 
    return $this->redirect($url); 
} 
public function navngiAction(Request $request) 
{ 
     $filnavn = $request->query->get('filnavn'); 
     $sti = $this->container->getParameter('kernel.root_dir'); 
     $websti = preg_replace('/app/','web',$sti,1); 
     print_r("Filnavn: " . $filnavn); 
     rename($websti . "/videoer/myfile.tmp",$websti . "/videoer/" . $filnavn); 
     $url = $this->generateUrl('largefile_index'); 
     return $this->redirect($url); 
} 

的原因重定向是爲了重命名正確收到文件名可變。

Ajax代碼是像上面但具有下列差別鏈接的文章中:

xhr.open( 「POST」,網址,FALSE); 使用我自己的本地主機url。我也在這裏嘗試過。不同之處在於,如果我們在第三個參數中有錯誤,它可以與小文件一起工作。

使用async true時,它似乎只給出兩個文件原來的myfile.tmp,我打開並重命名爲0kb的文件。 「filename.mp4」。

奇怪的是,當AJAX代碼運行:

xhr.onreadystatechange = function() 
       { 
        if(xhr.readyState == 4) 
        { 
         if(xhr.status == 200) 
         { 
          //alert("success");// process success 
                  alert("Filnavn: " + filnavn); 
         }else{ 
          // process error 
                  alert("Status: " + xhr.status); 
         } 
        } 
       }; 

狀態變成500,即使像16 MB的小文件,而無需其他問題完全上傳。

這裏是樹枝文件:

<h1>Test av å laste opp større filer</h1> 
    <form method="post" action="{{path('largefile_lastopp')}}"> 
     <label>Fil: </label> 
     <input type="file" name="fil" id="video" /><br /><br /> 
     <input type="hidden" name="filnavn" id="filnavn" /> 
     <input type="hidden" name="mimetype" id="mimetype" /> 

     <input onclick="upload('video',0)" type="submit" name="submit" /> 

    </form> 
    ::1 - - [10/Jun/2015:15:41:36 +0200] "POST /LargeFileUpload/web/app_dev.php/lastopp HTTP/1.1" 302 436 "http://localhost/LargeFileUpload/web/app_dev.php/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36" 
+1

可能服務器配置爲所需大小以下的MAX POST SIZE。 – mariobgr

+0

我想你是在用文章中的另一種方式混合標準文件上傳。看文章html。這是完全不同的 – venca

+0

我有一個很大的MAX POST SIZE – Stian

回答

0

我覺得這裏的問題是,客戶端代碼讀取整個文件一次,然後從它創建一個blob。如果您嘗試上傳1GB文件,那意味着在ist發送第一個字節之前,瀏覽器至少需要2GB RAM。

我可以想象,可能存在防止這種內存(ab-)使用的安全措施。

+0

謝謝你的信息。我覺得奇怪的是,如果安全措施阻止了某些事情,那麼沒有錯誤消息。如果是這種情況,我可以在某種日誌文件或不同的錯誤設置中找到錯誤消息嗎? – Stian

+0

不確定;取決於瀏覽器和客戶端操作系統。我會嘗試在客戶端代碼中添加一些日誌語句(或斷點,如果您的瀏覽器具有調試功能),以查看發生了什麼。 – fbitterlich

+0

我會如何解決「不能一次讀完整個文件」? – Stian

相關問題