php - PHP文件上传错误(UPLOAD_ERR_PARTIAL)/$ _FILES为空或具有空的“tmp_name”

标签 php ios file-upload image-uploading

我有一个非常常见的问题,花了几个小时阅读有关它的一些内容,但是我无法解决它,而且我会发疯...

语境

我有一个网站,用户可以在该网站上将图片上传到我的服务器上(通常是通过iOS / Safari浏览器)。带有上传表单的页面为this one

后端由PHP(无框架)组成。前端是HTML / Javascript。这是我在2010年制作的相当老的网站,因此这不是“超级性感”的网站! :-)

我制作了日志来监视上传结果,我发现大约30%的用户上传失败了……我想这是不常见的!

这些错误来自2个来源(同一位用户尝试上传几次,可能会混合使用这2个来源):


$_FILES['myFormFieldName']为NULL
$_FILES['myFormFieldName']不为NULL,但$_FILES['myFormFieldName']['error']为3(UPLOAD_ERR_PARTIAL),其中$_FILES['xxx']['tmp_name']$_FILES['xx']['type']为空,并且$_FILES['xxx']['size']为“ 0”


这些错误似乎不是确定性的...


当我测试自己时(使用与上载有问题的用户相同的图像),我没有问题
我在日志中看到一些用户发现上传总是有问题,而其他用户则没有。
我还看到一些遇到问题的用户几次重试后设法成功上传了文件
我与一个用户联系时遇到问题,他说在尝试上传照片时(无论是使用WiFi还是移动3G / 4G数据),他都从Safari获得Safari cannot open the page because network connection was lost错误页面






上传文件的表单HTML
(限制用户从客户端上传到35M)

    <ul class="pageitem">
        <form name="empty-custom-native" 
              enctype="multipart/form-data" 
              action="/upload.php?method=nativeUpload" 
              method="post">
            <input type="hidden" name="MAX_FILE_SIZE" value="36700160" />
            <li class="button" >
                <input type="file" name="iosImageFILE" id="iosImageFILE"/>
            </li>
        </form>
        <li class="button directUrlButton" onclick="javascript:onclickNativeUploadForm();">
            <input type="button" value="Upload" />
        </li>
    </ul>


HTML调用的Javascript
(用于在提交表单之前检查文件输入是否为空)

  function onclickNativeUploadForm(){
    if( document.getElementById('iosImageFILE').value=="" ){
      alert("Please choose an image FIRST !");
    } else{
      showPleaseWait();
      setTimeout(submitNativeUploadForm, 2000);
    }
  }

  function submitNativeUploadForm(){
      document.forms['empty-custom-native'].submit();
  }


PHP代码管理文件上传(提取)

<?php
if( isset($_FILES['iosImageFILE']) && !empty($_FILES['iosImageFILE']) ){
    $uploadStatus = $_FILES['iosImageFILE']['error'];
    if( $uploadStatus==0 ){
        // Copy source file to temp file
        if( !move_uploaded_file($_FILES['iosImageFILE']['tmp_name'], $_SERVER['DOCUMENT_ROOT']."/".$userImageTemp) ) {
            throw new Exception("fileUploadCopy");
        }

    } else{
        if( $uploadStatus==1 ){ throw new Exception("fileUploadIniSize"); }
        else if( $uploadStatus==2 ){ throw new Exception("fileUploadFormSize"); }
        else if( $uploadStatus==3 ){ throw new Exception("fileUploadPartial"); } // THIS ERROR ...
        else if( $uploadStatus==4 ){ throw new Exception("fileUploadNoFile"); }
        else if( $uploadStatus==6 ){ throw new Exception("fileUploadNoTmpDir"); }
        else if( $uploadStatus==7 ){ throw new Exception("fileUploadCantWrite"); }
        else if( $uploadStatus==8 ){ throw new Exception("fileUploadExtension"); }
        else{
            throw new Exception("fileUploadSystem");
        }
    }
} else{
    throw new Exception("fileUploadUpload"); // ... OR THIS ERROR
}

// If anything was OK, we continue here with the uploaded file copied in our working dir to do some stuff with it...
?>


因此,就我而言,我有fileUploadUploadfileUploadPartial例外。



调查

服务器端(php.ini配置)

我已经检查了处理文件上传的PHP环境变量(使用ini_get命令),以确保我没有超过最大文件大小或最大上传数量。

一切似乎都很好,我有很大的限制,post_max_sizeupload_max_filesize更大。 upload_tmp_dir为空,我想这意味着我使用默认系统/tmp目录?

告诉我您是否发现问题或其他要检查的内容。

注意:我无权访问php.ini,但是这些值由我的托管服务提供商固定(我在共享主机上)。

file_uploads : '1'
upload_tmp_dir : ''
upload_max_filesize : '128M'
max_file_uploads : '20'
post_max_size : '130M'
max_execution_time : '300'


客户端(HTML / JS代码)

MAX_FILE_SIZE小于我的PHP服务器允许的最大文件大小。

我按预期使用了enctype="multipart/form-data"method="post"

我不上传AJAX文件,只是在使用JS提交表单之前使用Javascript检查输入文件的空度。

服务器端(PHP代码)

当我调试$_FILES['iosImageFILE']的内容时,得到的是fileUploadPartial错误的内容(对于fileUploadUpload错误,它为null)。

iosImageFILE = {"name":"DD292A1C-9CBF-4843-9E1C-7C815593C67A.png","type":"","tmp_name":"","error":3,"size":0}

服务器端(文件系统)

我试图检查应该上传文件所在的/tmp目录,但是我无权访问它。我想检查一下是否不是“旧的tmp文件已满”,但我想不是。

实际上,我制作了一个PHP脚本来使用var_export(scandir('/tmp'))扫描其内容,而我只看到一些sess_xxxxx会话文件(大约7000个文件)。

代码升级

我已经将网站升级并增强为https(以前是非安全的http),并将PHP版本从5.6升级到7.0)。文件上传没有任何变化的问题。

防火墙?!?

我可能怀疑托管服务提供商存在防火墙问题(我已经读到它可能会阻止有关文件上传的某些事情……)。
但是他们说我主机上没有激活防火墙...



结论

我真的不知道接下来要检查什么以调查并发现此问题。

请注意,几乎每个人上传的文件都来自iOS / Safari浏览器。我不知道其他操作系统或浏览器是否会出现相同的问题...

我是一名前端Web开发人员,必须管理,对于这种问题我不满意。

任何帮助表示赞赏!

最佳答案

故事的结尾:怀疑,这是我的托管服务提供商遇到的问题(他们花了1个月的时间解决了...)

我没有得到更多详细信息,除了那是一个“ Apache配置问题”,而且它具有负载平衡的链接...

关于php - PHP文件上传错误(UPLOAD_ERR_PARTIAL)/$ _FILES为空或具有空的“tmp_name”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56041214/

相关文章:

php - 将数据保存到 WooCommerce session

ios - 分配自定义字体时出现异常

c# - 我应该处理 FileUpload.PostedFile.InputStream 吗?

php - "vertical"正则表达式匹配 ASCII "image"

php - TinyMVC PDO 层在数据库查询时引发错误

iphone - 检测过去的 UIAlertView

php - 删除文件上传的文件扩展名

jsf - 如何显示p :fileUpload invalidFileMessage in p:growl

php - 如何从使用 jquery 的 foreach 循环生成的表单中的输入字段中获取值

ios - Swift - 如何按顺序显示不同的文本