2013-02-20 43 views
0

我在PHP中有一个文件上传脚本。该脚本适用于较小(小于2MB)的文件,但需要使用该脚本上传的较大文件(大约20MB)不会上传。上传文件时出现奇怪的错误 - 我认为它与最大文件大小有关

的脚本如下,则更多的解释算账:

<?php 

if($_SERVER["REQUEST_METHOD"] == "POST") 
{ 
    $file = $_FILES["uploaddistance"]["name"]; 
    $fileTmpLoc = $_FILES["uploaddistance"]["tmp_name"]; 

    $pathlevel3 = 'distance/level3/'; 
    $pathlevel4 = 'distance/level4/'; 
    $pathlevel5 = 'distance/level5/'; 
    $pathlevel6 = 'distance/level6/'; 


    $level = $_POST['distancecourse']; 
    $module = $_POST['distancemodule']; 
    $kaboom = explode(".", $file); 
    $extension = end($kaboom); 

    if ($level == "level3"){ 
    $pathandname = $pathlevel3 . $module . '.' . $extension; 
    if (file_exists($pathandname)){ 
    unlink($pathandname); 
    $moveresult = move_uploaded_file($fileTmpLoc, $pathandname); 
    if ($moveresult == true){ 
    echo "Workbook uploaded"; 
    } 
    } 
    else { 
    $moveresult = move_uploaded_file($fileTmpLoc, $pathandname); 
    if ($moveresult == true){ 
    echo "Workbook uploaded"; 
    } 
    } 
    } 

    else if ($level == "level4"){ 
    $pathandname = $pathlevel4 . $module . '.' . $extension; 
    if (file_exists($pathandname)){ 
    unlink($pathandname); 
    $moveresult = move_uploaded_file($fileTmpLoc, $pathandname); 
    if ($moveresult == true){ 
    echo "Workbook uploaded"; 
    } 
    } 
    else { 
    $moveresult = move_uploaded_file($fileTmpLoc, $pathandname); 
    if ($moveresult == true){ 
    echo "Workbook uploaded"; 
    } 
    } 
    } 

    else if ($level == "level5"){ 
    $pathandname = $pathlevel5 . $module . '.' . $extension; 
    if (file_exists($pathandname)){ 
    unlink($pathandname); 
    $moveresult = move_uploaded_file($fileTmpLoc, $pathandname); 
    if ($moveresult == true){ 
    echo "Workbook uploaded"; 
    } 
    } 
    else { 
    $moveresult = move_uploaded_file($fileTmpLoc, $pathandname); 
    if ($moveresult == true){ 
    echo "Workbook uploaded"; 
    } 
    } 
    } 

    else if ($level == "level6"){ 
    $pathandname = $pathlevel6 . $module . '.' . $extension; 
    if (file_exists($pathandname)){ 
    unlink($pathandname); 
    $moveresult = move_uploaded_file($fileTmpLoc, $pathandname); 
    if ($moveresult == true){ 
    echo "Workbook uploaded"; 
    } 
    } 
    else { 
    $moveresult = move_uploaded_file($fileTmpLoc, $pathandname); 
    if ($moveresult == true){ 
    echo "Workbook uploaded"; 
    } 
    } 
    } 

    else { 
    echo "Error 1"; 
    echo $level; 
    echo $module; 
    } 

    } 

else { 
    echo "error 2"; 
} 

?> 

当我上传大文件时,“错误1”消息出现,表明没有POST值被传递给脚本。就像我说的,上传较小的文件时情况并非如此。

我试过创建一个自定义的php.ini文件并更改最大文件大小。我做了以下更改:

upload_max_filesize = 64M 
post_max_size = 64M 
memory_limit = 96M 

php.ini文件位于我的主目录(public_html)中。据我了解,这应该自动被目录内的任何脚本使用。当我在网站上运行phpinfo()测试时,它表示加载的配置文件是public_html/php.ini(详情请参阅http://www.xenonacademy.org.uk/phptest.php),这表明配置文件是正确的,但由于某些原因,问题仍然存在。

此外,运行此测试时,它显示memory_limit只是64M,而不是我在php.ini中指定的96,但upload_max_filesizepost_max_size是正确的。如果这些设置正确,为什么这不起作用?我是否需要在相关脚本中使用include()我的php.ini,或者在这里工作时是否有更复杂的东西?

任何人都可以解释我要去哪里错了吗?

谢谢!

+0

重新启动Apache/PHP? 'upload_max_filesize'可能需要这个才能获取。 – ficuscr 2013-02-20 18:16:29

+0

您是否收到内存限制错误或脚本是否只是超时?增加最大执行时间。你遇到了什么错误? – ficuscr 2013-02-20 18:22:25

+0

我得到的唯一错误是来自我自己的错误处理的'错误1',所以它看起来没有任何POST数据传递给脚本。这只发生在较大的文件上。 – Chris 2013-02-20 19:45:40

回答

1

你不能用“定制”的php.ini改变这些值之前使用,因为它不会是通常由web服务器读取。虚空使用ini_set,因为these directives属于PHP_INI_PERDIR类型。

但是,有时你可以用.htaccess文件进行更改,并按照文档的说明关于MAX_FILE_SIZE输入:

MAX_FILE_SIZE隐藏字段(单位为字节)必须放在文件输入字段,并将其值是PHP接受的最大文件大小。应该始终使用这个表单元素,因为它可以节省用户等待传输大文件的麻烦,以便发现它太大并且传输失败。

-1

您使用CA文件上传功能覆盖php.ini文件

ini_set('upload_max_filesize', '10M'); 
ini_set('post_max_size', '10M'); 
ini_set('max_input_time', 300); 
ini_set('max_execution_time', 300); 
+0

其中一些无法通过'ini_set'更改......它们会影响代码触发前发生的事情!看看['Changable column'](http://php.net/manual/en/ini.core.php)... PHP_INI_PERDIR。 – ficuscr 2013-02-20 18:15:50