我有一个非常普遍的问题,花了数小时阅读有关它的一些内容,但是我没有设法解决它,我会发疯...
我有一个网站,用户可以在其中将图片上传到我的服务器上(通常是通过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']
为空,{{1 }}为“ 0” 这些错误似乎不是确定性的...
$_FILES['xxx']['size']
错误页面要上传文件的表单HTML (限制用户从客户端上传到35M)
Safari cannot open the page because network connection was lost
HTML调用的Javascript (用于在提交表单之前检查文件输入是否为空)
<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>
用于管理文件上传(提取)的PHP代码
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
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...
?>
或fileUploadUpload
例外。
我已经检查了用于处理文件上传的PHP环境变量(使用fileUploadPartial
命令),以确保我没有超过最大文件大小或最大上传数量。
一切似乎都很好,我有很大的限制,ini_get
比post_max_size
差很多。 upload_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'
小于我的PHP服务器允许的最大文件大小。
我按预期使用了MAX_FILE_SIZE
和enctype="multipart/form-data"
。
我不上传AJAX文件,只是在使用JS提交表单之前使用Javascript检查输入文件是否为空。
当我调试method="post"
的内容时,我得到的是$_FILES['iosImageFILE']
错误(对于fileUploadPartial
的错误,它为空)。
fileUploadUpload
我试图检查应该上载文件的iosImageFILE = {"name":"DD292A1C-9CBF-4843-9E1C-7C815593C67A.png","type":"","tmp_name":"","error":3,"size":0}
目录,但是我无权访问它。我想检查一下是否不是“旧的tmp文件已满”,但我想不是。
实际上,我制作了一个PHP脚本来使用/tmp
扫描其内容,但我只看到一些var_export(scandir('/tmp'))
会话文件(大约7000个文件)。
我已经将网站升级并增强为https(以前是不安全的http),并将PHP版本从5.6升级到7.0)。文件上传没有任何问题。
我也许怀疑我的托管服务提供商出现防火墙问题(我读过它可能会阻止有关文件上传的某些事情……)。 但是他们说我主机上没有激活防火墙...
我真的不知道接下来要检查什么以调查并发现此问题。
请注意,几乎每个人上传的文件都来自iOS / Safari浏览器。我不知道其他操作系统或浏览器是否也会出现同样的问题...
我是一名前端Web开发人员,必须管理,我对这种问题不满意。
任何帮助表示赞赏!
答案 0 :(得分:0)
故事的结尾:怀疑,这是我的托管服务提供商遇到的问题(他们花了1个月的时间解决了...)
除了这是一个“ Apache配置问题”,并且它具有负载平衡链接之外,我没有设法获得更多详细信息。