Expo Android端图片上传功能异常,请求排查代码问题
针对你代码里的网络错误,以下是几个关键问题和修复方法:
URL格式错误
你的请求URL少了一个斜杠:https:/ff2f-160-202-36-170.ngrok-free.app,正确格式应该是https://ff2f-160-202-36-170.ngrok-free.app,缺失的斜杠会导致请求地址无效,直接触发网络错误。空Token导致授权失败
const token = "",如果后端接口要求有效的Bearer Token验证,空Token会被拒绝访问,返回401 Unauthorized错误,这也会被捕获为网络/请求异常。请填入有效的授权Token。FormData文件格式错误
在React Native/Expo中,直接将ImagePicker返回的selectedImage传入FormData是无效的,需要构造符合要求的文件对象:// 假设selectedImage是ImagePicker返回的结果 formData.append('file', { uri: selectedImage.uri, name: selectedImage.uri.split('/').pop(), // 从uri提取文件名 type: selectedImage.type || 'image/jpeg' // 根据实际图片类型设置 });后端需要正确识别文件的uri、名称和类型才能处理上传。
手动设置Content-Type导致解析失败
axios在处理FormData时会自动生成包含boundary的multipart/form-data请求头,手动设置'Content-Type': 'multipart/form-data'会丢失boundary参数,导致后端无法解析multipart数据。请移除headers中的这个配置:const headers = { 'Authorization': `Bearer ${token}`, accept: 'application/json' // 移除 'Content-Type': 'multipart/form-data' }调试日志优化
console.log(formData)无法在React Native中打印FormData的具体内容,建议改为打印单个字段:console.log('WorkforceId:', workforceId); console.log('File URI:', selectedImage.uri); console.log('FileType:', fileType);
修复后的完整代码示例:
async function uploadImages() { const token = "YOUR_VALID_TOKEN"; // 填入有效Token const workforceId = "ea3be847-c237-4191-aebc-9490d0f78fab"; const fileType = 1; const headers = { 'Authorization': `Bearer ${token}`, accept: 'application/json' }; try { const formData = new FormData(); formData.append('WorkforceId', workforceId); // 构造正确的文件对象 formData.append('file', { uri: selectedImage.uri, name: selectedImage.uri.split('/').pop(), type: selectedImage.type || 'image/jpeg' }); formData.append('fileType', fileType); // 优化调试日志 console.log('Upload params:', { WorkforceId: workforceId, FileName: selectedImage.uri.split('/').pop(), FileType: fileType }); const response = await axios.post('https://ff2f-160-202-36-170.ngrok-free.app/workforce/fileupload', formData, { headers: headers }); console.log(response.data); // true or false } catch (error) { // 打印更详细的错误信息 console.log('Upload error:', error.response?.data || error.message); throw error; } }
另外,确保你的Expo应用有网络权限(安卓默认允许,但模拟器需确认能访问ngrok地址),同时检查ngrok服务是否正常运行、地址是否正确。
内容的提问来源于stack exchange,提问作者Indresh Goswami

