Retrofit2文件上传异常:文件仅1KB无法打开排查求助
文件上传仅1KB无法打开的问题排查与修复
兄弟,我一眼就瞅到问题出在哪了!你上传的根本不是文件内容,而是文件的父目录路径字符串,这就难怪服务器上的文件只有1KB还打不开了。先拆解你的代码问题,再给你修复方案:
你的核心错误点
你在创建RequestBody的时候犯了一个致命失误:
// 错误:你传了目录路径getDirPath,而不是实际的文件origFile RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), getDirPath);
这段代码把目录路径当成了要上传的内容,服务器收到的只是一段文本(比如/storage/emulated/0/Download这种字符串),大小自然只有几字节到1KB,完全不是你选中的文件本身。
修复方案
1. 正确创建RequestBody(核心修复)
直接基于选中的文件origFile来创建RequestBody,同时指定合适的媒体类型:
File origFile = new File(PathHolder); // 用实际文件创建RequestBody,而不是目录路径 // 这里用application/octet-stream作为通用二进制类型,适配绝大多数文件 RequestBody requestFile = RequestBody.create(MediaType.parse("application/octet-stream"), origFile); multipartBody = MultipartBody.Part.createFormData("uploadFiles", origFile.getName(), requestFile); new UploadFileAsyncTask().execute();
2. 可选优化:动态匹配文件MediaType
如果想更精准地适配不同文件类型(比如图片、文档等),可以用MimeTypeMap来获取对应类型:
File origFile = new File(PathHolder); // 获取文件扩展名 String extension = MimeTypeMap.getFileExtensionFromUrl(origFile.getAbsolutePath()); // 根据扩展名获取MIME类型 String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); // 如果获取不到,默认用二进制流类型兜底 if (mimeType == null) { mimeType = "application/octet-stream"; } RequestBody requestFile = RequestBody.create(MediaType.parse(mimeType), origFile); multipartBody = MultipartBody.Part.createFormData("uploadFiles", origFile.getName(), requestFile);
3. 额外核对点
检查你的接口参数名和服务器接收的是否一致:你创建MultipartBody.Part时用的是"uploadFiles",而接口里的参数是@Part MultipartBody.Part attachFile,虽然这不是当前文件大小异常的原因,但要确保和后端约定的参数名完全匹配,避免后续其他问题。
小建议
另外提一句,AsyncTask现在已经被Android官方废弃了,推荐用Kotlin协程或者OkHttp的异步回调来处理网络请求,代码更简洁也更可靠。如果上传大文件,还可以加个进度监听,方便排查上传过程中的问题。
内容的提问来源于stack exchange,提问作者Shachi
相关产品推荐
相关产品推荐

