导入文件的MultipartFile导入文件的实现

2022-07-29 13:05:15

MultipartFile是Spring框架中用来处理文件上传的类

MultipartFile的代码路径是:import org.springframework.web.multipart.MultipartFile;

需要引入的jar包是spring-web.jar

在多部分请求中接收的上载文件的表示。

文件内容存储在内存中或临时存储在磁盘上。在任何一种情况下,如果需要,用户负责将文件内容复制到会话级或持久性存储。临时存储将在请求处理结束时清除。

在控制层中要注意:

 @ApiOperation(value = "导入输出实体信息")
    @ApiImplicitParams(
            {@ApiImplicitParam(name = "file", value = "导入的输出实体文件", dataType = "File",paramType = "form"),
            @ApiImplicitParam(name = "param", value = "其他值的Json参数", dataType = "String")})
    @RequestMapping(path = "/saveTask",method = {RequestMethod.POST},consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public Response importEntityFile(@RequestParam(value = "file") MultipartFile multipartFile,
                                     @RequestParam(value = "param") String param ) {
        return searchOfflineTaskService.saveTask(multipartFile,param);
    }


其中MediaType.MULTIPART_FORM_DATA_VALUE为String MULTIPART_FORM_DATA_VALUE = "multipart/form-data";及上传文件传递的http请求格式

在实现的时候再调用mulipartFile的getInputStream()方法得到InputStream导入流。使用InputStream中的ReadLine()方法,循环读出流中内容。可以在读出某一行内容的时候,同时对数据进行解析:

例如:解析CSV文件的时候,使用插件

   <dependency>
      <groupId>com.opencsv</groupId>
      <artifactId>opencsv</artifactId>
      <version>4.1</version>
   </dependency>
CSVParser、CSVParserBuilder方法进行解析,得到String[]

需要特别注意的是:

1.在界面上除了需要上传的文件以外,还有其他参数一起上传。

一般情况下,在不需要上传文件的情况下,使用@RequestBody @Valid ParamQo paramQo中的@RequestBody就可以将Json对象转换为Qo对象了。

但是在使用@RequestBody与@RequestParam(value = "file") MultipartFile multipartFile,没法结合使用,无法识别multipartFile中的内容。同时也无法识别@RequestBody的内容。

解决方法就是使用两个或者多个@RequestParam来分别传递数据。

例如在上面的例子中:

@RequestParam(value = "file") MultipartFile multipartFile,
@RequestParam(value = "param") String param

第二个参数就是将其他参数通过组装成Json传给后台。不怕辛苦的话,可以将写多个@RequestParam,分多个参数分别来传,不用前端组装成Json格式。

补充:——————

这部分的代码有一个问题,即第二个参数在后台接收不到。

 @ApiOperation(value = "导入输出实体信息")
    @ApiImplicitParams(
            {@ApiImplicitParam(name = "file", value = "导入的输出实体文件", dataType = "File",paramType = "form"),
            @ApiImplicitParam(name = "param", value = "其他值的Json参数", dataType = "String")})
    @RequestMapping(path = "/saveTask",method = {RequestMethod.POST},consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public Response importEntityFile(@RequestParam(value = "file") MultipartFile multipartFile,
                                     @RequestParam(value = "param") String param ) {
        return searchOfflineTaskService.saveTask(multipartFile,param);
    }


其中MediaType.MULTIPART_FORM_DATA_VALUE为String MULTIPART_FORM_DATA_VALUE = "multipart/form-data";及上传文件传递的http请求格式

问题出现在swagger上, @ApiImplicitParams (用在方法上包含一组参数说明)注解使用的错误或者不熟练。

 @ApiImplicitParam(name = "param", value = "其他值的Json参数", dataType = "String")中的缺少了paramType = "Query"字段。对paramType字段的理解见:https://mp.csdn.net/postedit/83627357

完整的可以接收到参数的例子如下:

 @ApiOperation(value = "导入输出实体信息")
    @ApiImplicitParams(
            {@ApiImplicitParam(name = "file", value = "导入的输出实体文件", dataType = "File" ,paramType = "form"),
              @ApiImplicitParam(name = "param", value = "其他值的Json参数", dataType = "String",paramType = "Query")})
    @RequestMapping(path = "/import/knowledge_file",method = {RequestMethod.POST},consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public Response importEntityFile(@RequestParam(value = "file",required = false) MultipartFile multipartFile,
                                     @RequestParam(value = "param",required= false) String param ) {
        return searchOfflineTaskService.saveTask(multipartFile,param);
    }

在@ApiImplicitParams,@ApiImplicitParam不熟悉的情况下尽量少用,容易踩坑。可以修改为下面的这个中方法

@ApiOperation(value = "导入输出实体信息")
@PostMapping(value = "/saveTask")
public Response importEntityFile(@ApiParam(value = "file",required = true) @RequestParam MultipartFile multipartFile,
                                 @ApiParam(value = "任务参数", required = true) @RequestParam String param ) {
    return searchOfflineTaskService.saveTask(multipartFile,param);

这样,使用@ApiParam注解更加简单了!也更加容易理解

——————

mulipartFile 是Spring中最常见的处理导入的方法,我现在才知道,惭愧!

  • 作者:yinni11
  • 原文链接:https://blog.csdn.net/yinni11/article/details/83793930
    更新时间:2022-07-29 13:05:15