php - 文件上传表单不适用于大文件

标签 php forms file-upload

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

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

但是,当尝试上传 40 MB 的文件时,它根本不起作用。起初,我以为是验证码问题,因为它让我无法输入正确的单词。禁用验证码后,我发现定义我所有 $_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'];
            }
        }
    }
?>

最佳答案

尝试增加 php.ini 文件中的 upload_max_filesizepost_max_size。将它们都设置为 50M 以确保。

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

sudo /etc/pathToApache/apache2 restart

Apache start/restart/stop docs.

关于php - 文件上传表单不适用于大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22519421/

相关文章:

javascript - 为什么只发送其中一份表格?

php - 造型 echo 错误

php - mysql 和 PHP 中的自动递增 ID

javascript - 如何使用 javascript 以表单形式调整多个图像的大小、预览和上传

html - 样式化文件上传按钮

php - 在Elasticsearch中查找类似主题(重复提名)

php - ZF2 通过 Composer 安装得到错误的 PHP 版本

php - MySql如何通过过滤多列来限制多个数字?

php - 实时php ajax在mysql数据库中编辑阿拉伯语单词给我问号字符(???)

php - 如果文件名存在于媒体上传目录中,则在文件名末尾添加数字