当前请求不是多部分请求Spring Boot和Postman(上传json文件加额外字段)

Fra*_*pos 2 java rest content-type spring-boot postman

Current request is not a multipart request当尝试为我的请求上传 json 文件和额外的 id 或 dto 对象时,我收到此错误,因为这也需要填充我的数据库。

当我只发送 json 文件时,所有内容都上传得很好,但现在我已将 id 字段添加到相关方法和 Postman 中,我收到此消息并努力调试和修复它,如果我能得到任何请帮助。

这些是涉及的部分:

@Controller
@RequestMapping("/api/gatling-tool/json")
public class StatsJsonController {

@Autowired
StatsJsonService fileService;

@PostMapping(value = "/import")
public ResponseEntity<ResponseMessage> uploadFile(@RequestParam("file") MultipartFile file, @RequestBody CategoryQueryDto categoryQueryDto) {
    String message = "";

    UUID id = categoryQueryDto.getId();

    if (StatsJsonHelper.hasJsonFormat(file)) {
        try {
            fileService.save(file, id);

            message = "Uploaded the file successfully: " + file.getOriginalFilename();
            return ResponseEntity.status(HttpStatus.OK).body(new ResponseMessage(message));
        } catch (Exception e) {
            message = "Could not upload the file: " + file.getOriginalFilename() + "!";
            return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(new ResponseMessage(message));
        }
    }

    message = "Please upload a json file!";
    return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseMessage(message));
}

}




@Service
public class StatsJsonService {

@Autowired
StatsJsonRepository repository;

public void save(MultipartFile file, UUID id) {
    StatsEntity statsEntity = StatsJsonHelper.jsonToStats(file, id);
    repository.save(statsEntity);
}

}


public class StatsJsonHelper {

public static String TYPE = "application/json";

public static boolean hasJsonFormat(MultipartFile file) {

    if (!TYPE.equals(file.getContentType())) {
        return false;
    }

    return true;
}

public static StatsEntity jsonToStats(MultipartFile file, UUID id) {

    try {
        Gson gson = new Gson();

        File myFile = convertMultiPartToFile(file);

        BufferedReader br = new BufferedReader(new FileReader(myFile));

        Stats stats = gson.fromJson(br, Stats.class);
         StatsEntity statsEntity = new StatsEntity();
        
        statsEntity.setGroup1Count(stats.stats.group1.count);
        statsEntity.setGroup1Name(stats.stats.group1.name);
        statsEntity.setGroup1Percentage(stats.stats.group1.percentage);


        statsEntity.setId(id);

        return statsEntity;

    } catch (IOException e) {
        throw new RuntimeException("fail to parse json file: " + e.getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述

在此输入图像描述

非常感谢。

https://github.com/francislainy/gadling_tool_backend/pull/3/files

更新

根据 @dextertron 的答案添加了更改(收到 415 不支持的媒体类型错误)

@PostMapping(value = "/import")
public ResponseEntity<ResponseMessage> uploadFile(@RequestParam("file") MultipartFile file, @RequestBody CategoryQueryDto categoryQueryDto) {
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述

即使我也将这部分从 application/json 更改为 multiform/data ,同样的错误仍然存​​在。

public static String TYPE = "multiform/data";
Run Code Online (Sandbox Code Playgroud)

wak*_*786 5

我在控制器中尝试了几种组合。

为我工作的那个看起来像这样。基本上我们必须将两个参数都作为 传递@RequestParam

    @PostMapping("/import")
    public ResponseEntity<Object> uploadFile(@RequestParam("file") MultipartFile file, @RequestParam String id) {
        return null;
    }
Run Code Online (Sandbox Code Playgroud)

我知道您想传递CategoryQueryDto@RequestBody但它似乎在多部分请求中@RequestParam并且@RequestBody似乎不能一起工作。

所以我认为你可以在这里做两件事:-

  1. 如上设计控制器,只需id在请求中发送 as 字符串并直接使用它fileService.save(file, id);在此输入图像描述

  2. 如果您仍然想使用,CategoryQueryDto可以发送它{"id":"adbshdb"},然后将其转换为CategoryQueryDto使用对象映射器。

这就是你的控制器的样子 -

    @PostMapping("/import")
    public ResponseEntity<Object> uploadFile(@RequestParam("file") MultipartFile file, @RequestParam String categoryQueryDtoString) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        CategoryQueryDto categoryQueryDto = objectMapper.readValue(categoryQueryDtoString, CategoryQueryDto.class);
// Do your file related stuff
        return ResponseEntity.ok().body(file.getOriginalFilename());
    }
Run Code Online (Sandbox Code Playgroud)

这就是您如何使用 postman/ARC 发送请求 -

在此输入图像描述

PS:不要忘记像这样设置 Content-Type 标头 - 在此输入图像描述