100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 文件上传MultipartFile实现图片压缩

文件上传MultipartFile实现图片压缩

时间:2022-02-14 16:35:04

相关推荐

文件上传MultipartFile实现图片压缩

MultipartFile上传图片并压缩

背景

之前写过一个图片上传,使用了spring的MultipartFile实现的,比较简单,限制了1M的大小,后来产品需求上传图片需压缩,遂着手开始实现

压缩工具

之前用过google的图片压缩工具thumbnailator,简单好用,决定这次也使用这个,具体使用可自行百度

github地址(/coobird/thumbnailator), pom引用

<!--thumbnailator 压缩工具--><dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version></dependency>

代码

talk is cheap,show me the code,话不多说,直接贴代码

@PostMapping("/uploadrespic")@ApiOperation(value = "上传文件")@ApiImplicitParams({@ApiImplicitParam(name = "platform", paramType = "query", dataType = "string", required = true),@ApiImplicitParam(name = "module", paramType = "query", dataType = "string", required = true),@ApiImplicitParam(name = "type", paramType = "query", dataType = "string", required = true)})public ResponseEnvelope imgUpload(@RequestPart("file") MultipartFile file,@RequestParam String platform,@RequestParam String module,@RequestParam String type) {LoginUser loginUser = LoginContext.getLoginUser(LoginUser.class);if (loginUser == null) {return new ResponseEnvelope(false, "请先登录");}//上传图片压缩start//记录原MultipartFile,如果压缩异常就用原来的MultipartFileMultipartFile oldMultipartFile = file;try {String fileName = file.getName();String originalFilename = file.getOriginalFilename();String contentType = file.getContentType();LocalDateTime now = LocalDateTime.now();//这里就是生成一个绝对路径,使用了公司的工具类FilePathUtil,几个参数都没什么重要含义,里面引用太多,就不贴出来了,大家测试随便给个路径出来能构建file对象就好了String absolutePath = FilePathUtil.absolutePath(storagePath, platform, "temp", type, now, file.getOriginalFilename());File tempFile = new File(absolutePath);Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(0.99f).toFile(tempFile);FileInputStream fileInputStream = new FileInputStream(tempFile);file = new MockMultipartFile(fileName, originalFilename, contentType, fileInputStream);fileInputStream.close();boolean success = tempFile.delete();log.info(CLASS_LOG_PREFIX + "删除临时file success:{}", success);} catch (IOException e) {log.error(CLASS_LOG_PREFIX + "压缩图片失败,把MultipartFile赋值为原来的值oldFile,exception:{}", e);file = oldMultipartFile;}//上传图片压缩endLocalDateTime now = LocalDateTime.now();String absolutePath = FilePathUtil.absolutePath(storagePath, platform, module, type, now, file.getOriginalFilename());Uploader uploader = UploaderFactory.createUploader(type, file, absolutePath);if (file.getSize() > DEFAULT_LIMIT) {return new ResponseEnvelope(false, "请上传小于1M的图片");}String baseName = getBaseName(absolutePath) + FilePathUtil.getExtension(absolutePath).toUpperCase();Pattern compile = pile(DEFAULT_RESFORMAT);Matcher matcher = compile.matcher(baseName);if (!matcher.find()) {return new ResponseEnvelope(false, "允许上传的图片格式为BMP\\JPG\\JPEG\\GIF\\PNG(格式不区分大小写)");}uploader.upload();FileVO fileVO = uploader.getFileVO();String returnPath = "/" + FilePathUtil.relativePath(storagePath, absolutePath);fileVO.setUrl(returnPath);//保存到数据库 并设置返回idLong picId = supplyDemandPicService.saveResPic(fileVO, type, absolutePath, loginUser, storagePath);fileVO.setResId(picId);if (picId == null || picId == 0) {return new ResponseEnvelope(false, "Failed to upload picture");}return new ResponseEnvelope(true, "Success to upload picture", fileVO);}

逻辑就在上传图片start和end中间的部分,没什么说的,就是把MultipartFile的输入流压缩到一个临时的file里,然后再根据临时file和之前的参数生成一个新的MultipartFile,完美的在之前的逻辑中嵌入了图片压缩,亲测有效,记录一下

后记

路还很长,不懂得还很多,坚持每天进步!!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。