php上传文件错误代码3

时间:2016-01-26 02:56:35

标签: php apache file-upload freebsd

上传更大的文件(> 10KB)将获得error code 3(UPLOAD_ERR_PARTIAL) in $_FILES['file']['error']小文件(< 10KB)将成功上传。

如果文件超过限制php post_max_size upload_max_filesize ,则应该获得error code 1 UPLOAD_ERR_INI_SIZE。但是,获取不正确的error code 3 UPLOAD_ERR_PARTIAL

我认为 apache设置有问题,并且不知道如何解决这个问题。

使用以下软件及其版本

  1. php 5.6.17
  2. apache 2.4.18
  3. 以下是php.ini

    post_max_size = 8M
    file_uploads = On
    upload_tmp_dir = "/tmp"
    upload_max_filesize = 2M
    

    当上传更大的文件(hi.png)时,错误日志在/var/log/httpd-error.log

    PHP Notice:  Missing mime boundary at the end of the data for file hi.png in Unknown on line 0
    

    这里是index.php

    <!DOCTYPE html>
    <html>
    <body>
        <form action='upload.php' method='post' enctype='multipart/form-data'>
        Select image to upload:
        <input type='file' name='fileToUpload' id='fileToUpload'>
        <input type='submit' value='Upload Image' name='submit'>
        </form>
    </body>
    </html>
    

    和upload.php

    <?php
    if($_FILES['fileToUpload']['error'] > 0){
        echo "error code".$_FILES['fileToUpload']['error']."<br>";
    }
    else{
        echo "file name:".$_FILES['fileToUpload']['name']."<br>";
        echo "file type:".$_FILES['fileToUpload']['type']."<br>";
        echo "file size:".$_FILES['fileToUpload']['size']."<br>";
        echo "file path:".$_FILES['fileToUpload']['tmp_name']."<br>";
    
        move_uploaded_file($_FILES['fileToUpload']['tmp_name'],"uploads/".$_FILES['fileToUpload']['name']);
    }
    ?>
    

1 个答案:

答案 0 :(得分:7)

我在使用php 5.6.18和apache 2.4.18的FreeBSD 10.1监狱中遇到了同样的问题:无论设置了哪个限制,7950字节以上的文件都会一直失败并且错误3一直存在。

经过多年的努力,我终于解决了这个问题:PHP模块(mod_php56)是使用apache2filter SAPI编译的,但是通过AddHandler作为处理程序启用。解决方案是查看端口选项并使用标​​准选项(不使用AP2FILTER)重建mod_php56

长篇故事:检查您是否有端口选项OPTIONS_FILE_SET+=AP2FILTER(Apache 2过滤器SAPI),但PHP以通常的方式配置为处理程序(AddType application/x-httpd-php .php)。删除选项(作为默认的构建/端口),并重建mod_php56包解决了我的问题。

要验证这是否也是您的情况,您可以回复php_sapi_name()。如果是apache2filter但是通过AddHandler指令启用了php,则会遇到同样的问题。重建后,您的php_sapi_name()应为 apache2handler 。这两个选项也可以在phpinfo()中检查,作为&#34; Apache 2.0 Filter&#34;和&#34; Apache 2.0处理程序&#34;

请注意,这并不能解释为什么它实际上破坏了上传(或者为什么模块首先使用Handler配置)。 你也可以通过启用mod_php作为过滤器而不是处理程序来成功,但我没有在这里检查。