java收octet-stream后转multipart方案

解决了一个前端传过来是二进制流,但后端用multipartfile收不到的问题。
因为octet-stream二进制流收到的是乱码,所以需要用inputstream自己转一层。
且二进制流不能区分多个参数,只能穿一个文件(变成二进制)过来。

    @RequestMapping(value = "/image/uploadV2", method = RequestMethod.POST)
    @ResponseBody
    public Response uploadPddImageV2(FileUploadDto fileUploadDto, HttpServletRequest request) throws Exception {
        if (request.getContentType().contains("multipart/form-data")) {
            // 安卓端走这个
            return uploadPddImage(fileUploadDto, request);
        }

        // ios端走这个 - application/octet-stream
        // 这边都是打印请求参数
        Enumeration enumeration = request.getHeaderNames();
        while ((enumeration.hasMoreElements())) {
            String name = (String) enumeration.nextElement();
            logger.biz("[uploadPddImageV2] headers : " + name + " : " + request.getHeader(name));
        }
        Enumeration enumeration1 = request.getParameterNames();
        while (enumeration1.hasMoreElements()) {
            String name = (String) enumeration1.nextElement();
            logger.biz("[uploadPddImageV2] params : " + name + " : " + JSON.toJSONString(request.getParameter(name)));
        }

		//  这个是前端通过hearder传过来的文件类型:jpeg,jpg,png
        String imgType = request.getHeader("img-type");

		// 文件格式校验
        if ("jpeg".equals(imgType) || "jpg".equals(imgType)) {
            imgType = MediaType.IMAGE_JPEG_VALUE;
        } else if ("png".equals(imgType)) {
            imgType = MediaType.IMAGE_PNG_VALUE;
        } else {
            throw new Exception("文件格式错误");
        }
		
		//  生成本地临时文件的保存路径
        String filePath = "/usr/local/tomcat/" + System.currentTimeMillis() + "." + imgType;
        Path dest = Paths.get(filePath);

        try {
        	// 转成对应的文件
            FileCopyUtils.copy(request.getInputStream(), Files.newOutputStream(dest));
        } catch (Exception e) {
            logger.error("[uploadPddImageV2] 转换文件失败...", e);
        }
		
		// 把转成的file文件转成multiPartFile,然后再调用原先的方法。用完记得删除本地临时文件
        File localFile = new File(filePath);
        if (localFile != null) {
            fileUploadDto = new FileUploadDto();
            fileUploadDto.setFile(getMultipartFile(localFile, imgType));
            fileUploadDto.setImageType(1);
            String path = imageService.uploadImage(fileUploadDto, getSessionUser());

            // 用完以后删除文件
            localFile.delete();
            return response(ImmutableMap.of("picUrl", path));
        }

        return new Response();
    }

	// 这是一个file转multiPartFile的方法,imgType为前端传过来,然后用MediaType获取到的文件类型
    public static MultipartFile getMultipartFile(File file, String imgType) {
        FileItem item = new DiskFileItemFactory().createItem("file"
                , imgType
                , true
                , file.getName());
        try (InputStream input = new FileInputStream(file);
             OutputStream os = item.getOutputStream()) {
            // 流转移
            IOUtils.copy(input, os);
        } catch (Exception e) {
            throw new IllegalArgumentException("Invalid file: " + e, e);
        }

        return new CommonsMultipartFile(item);
    }
    ```


版权声明:本文为zoelee_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。