You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:46:51