Spring REST如何接收Retrofit API发送的多文件请求?
解决Spring REST无法接收安卓端多文件上传的问题
我之前也碰到过一模一样的问题,折腾了好一会儿才搞定,咱们一步步来解决:
首先检查Spring的Multipart配置
如果你的Spring环境没有正确配置Multipart解析器,就算请求格式对了也没法解析文件。
如果你用的是Spring Boot
直接在application.properties(或application.yml)里加这些配置:
# 开启multipart支持 spring.servlet.multipart.enabled=true # 单个文件最大大小,根据你的需求调整 spring.servlet.multipart.max-file-size=10MB # 整个请求的最大大小 spring.servlet.multipart.max-request-size=50MB
如果你用的是传统Spring MVC
需要在配置类里手动注册MultipartResolver Bean:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.multipart.commons.CommonsMultipartResolver; @Configuration public class WebConfig { @Bean public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setMaxUploadSize(52428800); // 50MB resolver.setMaxUploadSizePerFile(10485760); // 10MB per file resolver.setDefaultEncoding("UTF-8"); return resolver; } }
调整你的Controller代码
你的原代码有几个可以优化的点,调整后应该能正常接收文件:
import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; @RestController public class FileUploadController { @RequestMapping(value="/multipleFilesUpload", method=RequestMethod.POST, consumes="multipart/form-data", produces="application/json") public ResponseEntity<?> multipleFileUpload( @RequestParam("desc") String desc, @RequestParam("files") List<MultipartFile> files) throws IOException { System.out.println("Received description: " + desc); // 先判断文件列表是否为空 if (files == null || files.isEmpty()) { return ResponseEntity.badRequest().body("No files were uploaded"); } // 遍历文件处理 for (MultipartFile file : files) { System.out.println("Uploaded file name: " + file.getOriginalFilename()); // 这里可以添加文件保存、业务处理逻辑 } return ResponseEntity.ok("Files uploaded successfully"); } }
注意:参数顺序不影响,但要确保@RequestParam("files")的名称和安卓端传参的key完全一致。
安卓端的关键注意事项
这一步很容易踩坑!安卓端上传时,每个文件的参数名必须都是files,这样Spring才能把它们自动收集成List<MultipartFile>。举个用OkHttp实现的例子:
import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import java.io.File; import java.io.IOException; import java.util.List; public class FileUploadUtil { public static void uploadFiles(List<File> fileList, String desc) throws IOException { OkHttpClient client = new OkHttpClient(); MultipartBody.Builder requestBodyBuilder = new MultipartBody.Builder() .setType(MultipartBody.FORM) // 添加描述参数 .addFormDataPart("desc", desc); // 逐个添加文件,注意这里的参数名都是"files" for (File file : fileList) { requestBodyBuilder.addFormDataPart( "files", // 这个key必须和Controller里的@RequestParam名称一致 file.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file) ); } Request request = new Request.Builder() .url("http://your-server-address:port/multipleFilesUpload") .post(requestBodyBuilder.build()) .build(); Response response = client.newCall(request).execute(); // 处理响应... } }
如果安卓端给每个文件用了不同的key(比如file1、file2),Spring就没法识别成List,这是最常见的原因!
测试建议
先用Postman或者curl模拟请求,确认服务端能正常接收文件,再排查安卓端的问题:
比如用curl命令:
curl -X POST -F "desc=test description" -F "files=@file1.jpg" -F "files=@file2.png" http://your-server-url/multipleFilesUpload
如果服务端能打印出文件名,说明服务端没问题,再去检查安卓端的代码。
内容的提问来源于stack exchange,提问作者K Kishore Kumar Reddy
相关产品推荐
相关产品推荐

