解决了一个前端传过来是二进制流,但后端用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版权协议,转载请附上原文出处链接和本声明。