2012-04-22 41 views
3

我使用ajax和PHP的上传脚本,它可以为小于80MB的文件创造奇迹。但是,如果文件大于80MB,则失败,甚至不会输出任何内容。php://输入大文件失败

的代码是:

$maxsize = getMaxFileSize(); 
$finalfile = $uploadpath . $finalname; 
$putdata = fopen("php://input", "r"); 
$fp = fopen($finalfile, "w"); 
$filesizecalc = 0; 
while ($data = fread($putdata, 1024)) { 
    fwrite($fp, $data); 
    $filesizecalc = $filesizecalc + 1024; 
} 

fclose($fp); 
fclose($putdata); 
if ($filesizecalc <= $maxsize) { 
    addFile($_SESSION['userdata']['userid'], $finalname); 
    echo "$fn uploaded"; 
} else { 
    unlink($finalfile); 
} 
exit(); 

这工作得很好,几乎所有的文件< 80 MB,但超过80MB的文件大它不输出的东西,所以我甚至不知道发生了什么事情错,尽管我设置了

error_reporting(E_ALL | E_NOTICE); 
ini_set('display_errors', 1); 
ini_set('memory_limit', '1024M'); 
ini_set('upload_max_filesize', '1024M'); 
ini_set('post_max_size', '1024M'); 
ini_set('max_input_time', 10000); 
ini_set('max_execution_time', 10000); 
+1

运行php_info()。通常upload_max_filesize不能使用ini_set – SimSimY 2012-04-22 14:28:02

+0

进行设置。你是对的,它没有用ini_set设置。但是,它被主机设置为100M,对于一个99MB的文件应该足够了,对吧? 此外,max_input_time设置为60,是不是也低到? – 2012-04-22 14:40:32

+0

我想说,上传100MB限制的99MB文件是有风险的 - 你应该为标题,控制数据包等额外增加10%.60秒内100MB的上传速度为1.7mb/s(上传速度为13.5Mb)。可能它是不够的 – SimSimY 2012-04-22 14:46:26

回答

3

让我们把它写下来作为解决方案,以便它可以被正确读取而不是在评论中挖掘。

  • 中ini_set命令后,请检查您php_info(),一些配置 变量不能从脚本改为有〜6个不同 值来控制大的上传。检查所有这些(该列表和 可以找到here
  • 检查在apache error_log文件的真正的错误。 (或检查的访问日志,看看 什么由服务器返回的请求状态)
  • 可能有 限制请求 时间一些应用防火墙或Apache的配置。在这种情况下,您会看到响应代码,如“连接 重置”。

尝试W3Scools upload script:中ini_set后

<?php 
if (true) 
    { 
    if ($_FILES["file"]["error"] > 0) 
    { 
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; 
    } 
    else 
    { 
    echo "Upload: " . $_FILES["file"]["name"] . "<br />"; 
    echo "Type: " . $_FILES["file"]["type"] . "<br />"; 
    echo "Size: " . ($_FILES["file"]["size"]/1024) . " Kb<br />"; 
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; 

    if (file_exists("upload/" . $_FILES["file"]["name"])) 
     { 
     echo $_FILES["file"]["name"] . " already exists. "; 
     } 
    else 
     { 
     move_uploaded_file($_FILES["file"]["tmp_name"], 
     "upload/" . $_FILES["file"]["name"]); 
     echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; 
     } 
    } 
    } 
else 
    { 
    echo "Invalid file"; 
    } 
?> 
+0

好吧,我已经检查了一切,它仍然失败。所有的配置变量设置为巨大的值,error_log文件是干净的,access_log始终显示OK 200.我迷路了:\ – 2012-04-22 15:20:03

+0

您可以上传访问日志的最后几行。最后一个参数应该是响应大小。以及你可以放几个“回声”命令,看看scrpit有多远。顺便说一句,如果你上传小文件会发生什么?试试我添加的脚本。 – SimSimY 2012-04-22 15:27:01

+0

如果我在php://输入中获取文件,我可以使用该脚本吗? – 2012-04-22 16:07:54