【问题标题】:File upload form does not work with large files文件上传表单不适用于大文件
【发布时间】:2014-03-19 22:23:26
【问题描述】:

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

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

但是,当尝试上传 40 MB 的文件时,它根本不起作用。起初,我以为是 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'];
            }
        }
    }
?>

【问题讨论】:

  • 您的 php.ini 中为文件上传指定的文件大小是多少?见这里:drupal.org/node/97193
  • 最初是 2M,尽管我只是通过您的链接和此处的其他答案增加了该限制。到目前为止仍然无法正常工作,即使在重新启动 apache2 之后也是如此
  • 可以上传小文件吗?至少要确定您的服务器配置没有更大的问题

标签: php forms file-upload


【解决方案1】:

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

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

sudo /etc/pathToApache/apache2 restart

Apache start/restart/stop docs.

【讨论】:

  • 我把它们都设置为200M,保存并重新启动apache2。没有什么不同。
  • 您运行的是框架还是 CMS?他们可能在 .htaccess 文件中有自定义 PHP 属性或条目,也限制了这一点。
  • 一切都是从零开始构建的,服务器是我自己的。 PHP 和 apache 设置是库存(嗯,不包括新更改的大小限制)
  • 您需要查看在尝试时生成的错误代码,如@skrilled 所述。
  • 好的,我会在一个小时左右解决它。干杯。
【解决方案2】:

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

php_value post_max_size 100M
php_value upload_max_filesize 100M

【讨论】:

    【解决方案3】:

    比简单地更新您的 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

    【讨论】:

    • 我将echo $_FILES['file']['error']; 放在我的操作文件代码的顶部。关于未定义的索引,我遇到了同样的错误('file' 是文件选择输入的名称。编辑:它为正确上传的文件返回 0,这当然是应该的。
    • 您能否编辑您的问题并显示用于发布所述数据的表单的代码。
    • 完成。我还包含了上传代码,以防万一那端可能出现问题。
    猜你喜欢
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2021-09-19
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多