Android端AJAX上传网站图片失败问题排查
Android端AJAX图片上传失败排查与修复
你的AJAX图片上传功能在PC端Chrome浏览器正常,但Android手机端仅能检测到文件存在(输出Something, something, something)却无法完成上传展示,结合你的代码和Debian+Apache2+PHP8.2环境,以下是问题分析和修复方案:
核心问题分析
1. PHP代码的关键缺陷
- 错误的空文件判断逻辑:单文件上传时
$_FILES['image']['name']是字符串而非数组,你用empty($_FILES['image']['name'][0])会取字符串第一个字符,永远不会触发空文件判断,且后续代码无错误反馈机制。 - 缺乏上传错误捕获:Android端上传可能因文件大小超限、临时文件写入失败等触发错误,但你未检查
$_FILES['image']['error']状态。 - 冗余输出干扰结果:
print('Something, something, something')会输出额外内容,打断后续图片HTML的正常输出,导致前端无法正确解析结果。 - 文件名处理不严谨:Android上传的图片文件名可能包含空格、特殊字符,直接拼接会导致
move_uploaded_file执行失败。
2. 前端代码的潜在冲突
- jQuery重复引入:HTML中引入了
jquery-1.11.3,JS部分又引入jquery-3.2.1,可能引发兼容性问题,影响Android端FormData的正常处理。
修复后的完整代码
修复后的HTML代码
<!doctype html> <html> <head lang="en"> <meta charset="utf-8"> <title>Ajax upload test</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- 适配移动端 --> <link rel="stylesheet" href="style.css" type="text/css" /> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script type="text/javascript" src="script.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-8"> <br> <form id="form" action="ajaxupload.php" method="post" enctype="multipart/form-data"> <input id="uploadImage" type="file" accept="image/*" name="image" /> <div id="preview"><img src="filed.png" /></div><br> <input class="btn btn-success" type="submit" value="Upload"> </form> <div id="err"></div> <br> </div> </div> </div> </body> </html>
修复后的JS代码
$(document).ready(function (e) { $("#form").on('submit',(function(e) { e.preventDefault(); $.ajax({ url: "ajaxupload.php", type: "POST", data: new FormData(this), contentType: false, cache: false, processData:false, beforeSend : function() { $("#err").fadeOut(); }, success: function(data) { if(data=='invalid') { $("#err").html("Invalid File !").fadeIn(); } else if(data.startsWith('error:')) { $("#err").html(data.replace('error:','')).fadeIn(); } else { $("#preview").html(data).fadeIn(); $("#form")[0].reset(); } }, error: function(e) { $("#err").html("请求失败:" + e.statusText).fadeIn(); } }); })); });
修复后的PHP代码
<?php $valid_extensions = array('jpeg', 'jpg', 'png', 'gif', 'bmp'); // 按需调整允许的格式 $path = 'qrcode/'; $response = ''; // 确保上传目录存在且可写 if (!is_dir($path)) { mkdir($path, 0755, true); } if (!is_writable($path)) { $response = 'error:上传目录不可写,请检查权限'; echo $response; exit; } // 检查文件上传状态 if (!isset($_FILES['image']) || $_FILES['image']['error'] !== UPLOAD_ERR_OK) { $error_msg = match($_FILES['image']['error']) { UPLOAD_ERR_INI_SIZE => '文件大小超过php.ini限制', UPLOAD_ERR_FORM_SIZE => '文件大小超过表单限制', UPLOAD_ERR_PARTIAL => '文件仅部分上传', UPLOAD_ERR_NO_FILE => '未选择文件', default => '上传失败,错误码:' . $_FILES['image']['error'], }; $response = 'error:' . $error_msg; echo $response; exit; } $img = $_FILES['image']['name']; $tmp = $_FILES['image']['tmp_name']; $file_size = $_FILES['image']['size']; // 限制文件大小(示例:5MB) $max_size = 5 * 1024 * 1024; if ($file_size > $max_size) { $response = 'error:文件大小不能超过5MB'; echo $response; exit; } // 生成安全文件名,避免特殊字符 $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); $safe_filename = uniqid() . '.' . $ext; $final_path = $path . $safe_filename; // 验证格式并保存文件 if (in_array($ext, $valid_extensions)) { if (move_uploaded_file($tmp, $final_path)) { $response = "<img src='$final_path' />"; } else { $response = 'error:文件保存失败,请检查服务器权限'; } } else { $response = 'invalid'; } echo $response; ?>
服务器环境配置检查
- 调整PHP上传限制:编辑
/etc/php/8.2/apache2/php.ini文件,修改以下参数:
修改后重启Apache:upload_max_filesize = 10M post_max_size = 10M max_execution_time = 30sudo systemctl restart apache2 - 确保上传目录权限正确:
sudo chown www-data:www-data qrcode/ sudo chmod 755 qrcode/
内容的提问来源于stack exchange,提问作者Damien
相关产品推荐
相关产品推荐

