2015-06-10 40 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

相关问题