PHP 上传文件错误代码 3


php upload file error code 3

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

如果文件超过 php post_max_sizeupload_max_filesize的限制,它应该得到error code 1 UPLOAD_ERR_INI_SIZE。但是,得到error code 3 UPLOAD_ERR_PARTIAL这是不正确的

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

使用以下软件及其版本

  1. PHP 5.6.17
  2. 阿帕奇 2.4.18

以下是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

以下是索引.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>

和上传.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']);
}
?>

我在 FreeBSD 10.1 监狱中使用 php 5.6.18 和 apache 2.4.18 时遇到了同样的问题:超过 7950 字节的文件会不断失败并出现错误 3,无论设置了哪个限制。

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

长话短说:检查您是否打开了端口选项OPTIONS_FILE_SET+=AP2FILTER(Apache 2 Filter SAPI),但 PHP 将通常的方式配置为处理程序 (AddType application/x-httpd-php .php )。删除该选项(如默认构建/端口一样),并重建mod_php56包为我解决了问题。

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

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