文件上载表单不适用于大文件

时间:2014-03-19 22:23:26

标签: php forms file-upload

我有一个非常标准的上传表单。一些文本输入,文件上传输入,reCAPTCHA和提交按钮。

在正常使用下,我可以上传一个小文件就好了。表单数据被重定向到action属性中的页面,并且在处理上载的PHP和SQL中完成了一些事情。

但是,在尝试上传40 MB文件时,它根本不起作用。起初,我认为这是CAPTCHA,因为它给了我关于未能输入正确单词的错误。禁用CAPTCHA后,我发现定义了所有$ _POST ['input']的变量没有被传递。我会得到PHP错误,如:

Notice: Undefined index: name in /var/www/upload.php on line 18

第18行是$name=$_POST['name'];

对于我表单中的每个输入,我都会得到其中一个。

这告诉我POST没有被设置,因为在发送大文件时表单不起作用,所以我的问题只是......为什么?当然,解决方案是什么?

编辑:相关代码:

提交表格:

<form action="/upload.php" method="post" enctype="multipart/form-data">
    <ul>
        <li>
            <input class="text" type="text" name="name">
        </li>
        <li>
            <input class="text" type="email" name="email" placeholder="<?php echo $content['SubmitFormEmailPlaceholder'];?>">
        </li>
        <li>
            <input type="file" name="file">
            <input class="text" type="text" name="url" placeholder="http://">
        </li>
        <li>
            <textarea class="text" name="notes" rows="5"></textarea>
        </li>
        <li>
            <?php
                require_once($_SERVER['DOCUMENT_ROOT'].'/resources/recaptchalib.php');
                $publickey = "key";
                echo recaptcha_get_html($publickey);
            ?>
        </li>
        <li>
            <input type="submit">
        </li>
    </ul>
</form>

上传代码:

<?php
    date_default_timezone_set('UTC');
    //echo $_FILES['file']['error'];
    require_once($_SERVER['DOCUMENT_ROOT'].'/resources/recaptchalib.php');
    $privatekey="key";
    $resp=recaptcha_check_answer($privatekey,$_SERVER["REMOTE_ADDR"],$_POST["recaptcha_challenge_field"],$_POST["recaptcha_response_field"]);
    if(!$resp->is_valid){
        echo "<h1>".$content['UploadError']."</h1>".$content['UploadCaptcha']."<br><br>".$content['UploadReturn'];
    }else{
        $name=$_POST['name'];
        $email=$_POST['email'];
        if(empty($name)){
            echo "<h1>".$content['UploadError']."</h1>".$content['UploadName']."<br><br>".$content['UploadReturn'];
        }elseif(empty($email)){
            echo "<h1>".$content['UploadError']."</h1>".$content['UploadEmail']."<br><br>".$content['UploadReturn'];
        }else{
            $url=$_POST['url'];
            $notes=$_POST['notes'];
            $timedate=date('YmdHis');
            $dbHandle=new PDO("mysql:host=localhost;dbname=upload;","user","password",array(PDO::ATTR_EMULATE_PREPARES => false));
            $dbHandle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $query=$dbHandle->prepare("INSERT INTO `data` (approved,name,email,fileid,url,notes,timedate,viewcount) VALUES(?,?,?,?,?,?,?,?)");
            $types=array(
                'jpg','jpeg','gif','png',
                'mp3','wma','wav','ogg','aac','flac',
                'avi','wmv','mov','ogg','webm','mpg','mpeg','mp4'
            );
            $filechk=(isset($_FILES['file']) && !empty($_FILES['file']['name']));
            $urlchk=(isset($url) && !empty($url));
            if(!$filechk ^ $urlchk){
                echo "<h1>".$content['UploadError']."</h1>".$content['UploadFileURL']."<br><br>".$content['UploadReturn'];
            }elseif($filechk){
                $filesize=(75*1024*1024);
                $up_path=$_SERVER['DOCUMENT_ROOT'].'/resources/uploads/';
                $filename=$timedate.$_FILES['file']['name'];
                $ex=explode(".",$filename);
                $ext=strtolower(end($ex));
                if(file_exists($up_path.$filename)) {
                    $filename=$timedate.'Duplicate.'.$ext;
                }
                if(!in_array($ext,$types)){
                    echo "<h1>".$content['UploadError']."</h1>".$content['UploadFileType']."<br><br>".$content['UploadReturn'];
                }elseif(filesize($_FILES['file']['tmp_name'])>$filesize){
                    echo "<h1>".$content['UploadError']."</h1>".$content['UploadFileSize'].($filesize/1024/1024)." MB<br><br>".$content['UploadReturn'];
                }elseif(!is_writable($up_path)){
                    echo "<h1>".$content['UploadError']."</h1>".$content['UploadWriteError']."<br><br>".$content['UploadReturn'];
                }elseif(move_uploaded_file($_FILES['file']['tmp_name'],$up_path.$filename)){
                    $fileid=$filename;
                    $url=null;
                    $query->execute(array('N',$name,$email,$fileid,$url,$notes,$timedate,'0'));
                    echo "<h1>".$content['UploadSuccess']."</h1>".$content['UploadHomepage'];
                }else{
                    echo "<h1>".$content['UploadUnknownError']."</h1>".$content['UploadReturn'];
                }
            }else{
                $fileid=null;
                $query->execute(array('N',$name,$email,$fileid,$url,$notes,$timedate,'0'));
                echo "<h1>".$content['UploadSuccess']."</h1>".$content['UploadHomepage'];
            }
        }
    }
?>

3 个答案:

答案 0 :(得分:5)

尝试并增加upload_max_filesize文件中的post_max_sizephp.ini。将它们设置为50M以确定。

你也应该在改变之后重启apache。这取决于您的设置,因此将pathToApache替换为服务器上的apache路径;

sudo /etc/pathToApache/apache2 restart

Apache start/restart/stop docs.

答案 1 :(得分:1)

问题在于你的php web服务器配置文件。所以你必须在服务器的php.ini文件中将post_max_size和upload_max_filesize更改为100。如果您无权在服务器中更改它,那么在您的htaccess文件中添加以下行:

php_value post_max_size 100M
php_value upload_max_filesize 100M

答案 2 :(得分:0)

比简单地更新你的php.ini max_upload_filesize更好的答案是实际编码,期望错误可能发生,并适当地处理它们。提高你的文件大小是最大问题的最后一个问题,在这个问题中,你期望世界是完美的,你的代码将始终在所有测试用例下完美运行。

实现所述更好方法的一种方法:

if($_FILES['fileVarName']['error'] != UPLOAD_ERR_OK) {
  // we had an error uploading the file, let's handle it like a boss
}

以下列出了可能的错误:http://www.php.net/manual/en/features.file-upload.errors.php