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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:39:12