Spring boot 接收文件

需求:

  • 实现一个api可以上传文件及各种参数

过程:

  • 因为是上传文件所以不可能是get 请求 所以添加一个controller 行为 
    @PostMapping(path = "/post")
  • 存在特有的必填参数所有在controller 里加上对应参数
    @RequestParam(name = "test1") String test1
    ​​​​​​​@RequestParam(name = "test2") String test2
  • 因为上传文件binary 是流的形式所以加上 文件流
    InputStream dataStream
  • 文件流可以通过
    byte[] targetArray = inputStream.readAllBytes();

    转化成字节数组的形式被java 获取,之后再对文件做处理

衍生:

  • 上传多个文件,存在非必填参数

过程:

  • 如果是多个文件单独的流已经无法满足,传递方式也由原先的binary 转换成 form-data
  • 既然已经不是流的形式,之前的获取请求参数的方式就不可行,通过httpRequest获取
    HttpServletRequest httpRequest
  • 可以通过 StandardServletMultipartResolver 来判定是否为多文件
    StandardServletMultipartResolver resolver = new StandardServletMultipartResolver();
    resolver.isMultipart(httpRequest)
  • 如果是单文件就通过 request 来获取文件流
    InputStream inputStream = httpRequest.getInputStream()
    byte[] targetArray = inputStream.readAllBytes();
  • 如果是多文件就将HttpServletRequest 转换成 MultipartHttpServletRequest,并获取文件map
    MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(httpRequest);
    MultiValueMap<String, MultipartFile> multiFileMap = multipartRequest.getMultiFileMap();
  • 循环map 获取文件信息
    multiFileMap.forEach(
        (String key, List<MultipartFile> multipartFileList) -> {
            for(MultipartFile obj : multipartFileList) {
                try {
                    byte[] fileByte = obj.getBytes();
                    MultiPartParam multiPartParam =
                        new MultiPartParam(key, fileByte, obj.getOriginalFilename());
                        fileList.add(multiPartParam);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    });
  • 获取非必填参数可以通过httpRequest 获取
    Map<String, String[]> params = httpRequest.getParameterMap()
    

注意:

  •  InputStream dataStream 和 @RequestBody 不能同时使用,同时使用 dataStream 会失效
@PostMapping(path = "/post")
    public ResponseEntity postFile(
            HttpServletRequest httpRequest,
            @RequestParam(name = "productId") String productId,
            @RequestParam(name = "code") String code,
            @RequestParam(name = "n", defaultValue = "3", required = false) String topn
    ) {
        try (InputStream inputStream = httpRequest.getInputStream()){
            ReactHttpClient httpClient = ReactHttpClient.create(0, 5 * 60000);
            StandardServletMultipartResolver resolver = new StandardServletMultipartResolver();
            HttpResponse response;
            String engineUrl = "http://10.40.10.92:5003?n=" + topn;
            Map<String, String> params = new HashMap<>();
            Map<String, String> header = new HashMap<>();
            if (resolver.isMultipart(httpRequest)) {
                MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(httpRequest);
                MultiValueMap<String, MultipartFile> multiFileMap = multipartRequest.getMultiFileMap();
                List<MultiPartParam> fileList = new ArrayList<>();

                multiFileMap.forEach((String key, List<MultipartFile> multipartFileList) -> {
                    for(MultipartFile obj : multipartFileList) {
                        try {
                            byte[] fileByte = obj.getBytes();
                            MultiPartParam multiPartParam = new MultiPartParam(key, fileByte, obj.getOriginalFilename());
                            fileList.add(multiPartParam);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
                response = httpClient.postBody(engineUrl, params, fileList, header).block();
            } else {
                byte[] targetArray = inputStream.readAllBytes();
                response = httpClient.postBody(engineUrl, targetArray).block();
            }
            return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(response.getResponse());
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值