http://blog.csdn.net/frankcheng5143/article/details/53185201

************************************************************************

文件上传是一个最基本的功能,往往我们需要对图片进行压缩,来加快移动端的加载速度。

SprimgMVC图片上传可以参考SpringMVC传值

从这里开始

  1. System.out.println("文件大小: " + file.getSize());
  2. System.out.println("文件类型: " + file.getContentType());
  3. System.out.println("表单名称: " + file.getName());
  4. System.out.println("文件原名: " + file.getOriginalFilename());
  5. if (!file.getContentType().contains("image")) {
  6. return BaseReturn.response(ErrorCode.FAILURE, "不支持的图片类型:" + file.getContentType());
  7. }
  8. String image = ImageService.saveImage(request, file, uploadPath);

相关依赖

  1. <!-- 图片压缩 -->
  2. <dependency>
  3. <groupId>net.coobird</groupId>
  4. <artifactId>thumbnailator</artifactId>
  5. <version>0.4.8</version>
  6. </dependency>
  7. <!-- cmyk格式图片转换 -->
  8. <dependency>
  9. <groupId>com.twelvemonkeys.imageio</groupId>
  10. <artifactId>imageio-jpeg</artifactId>
  11. <version>3.3</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>com.twelvemonkeys.imageio</groupId>
  15. <artifactId>imageio-tiff</artifactId>
  16. <version>3.3</version>
  17. </dependency>

ImageService

  1. package com.jrbac.service;
  2.  
  3. import java.awt.image.BufferedImage;
  4. import java.io.File;
  5. import java.io.IOException;
  6.  
  7. import javax.imageio.ImageIO;
  8. import javax.imageio.stream.ImageOutputStream;
  9. import javax.servlet.http.HttpServletRequest;
  10.  
  11. import org.apache.commons.io.FileUtils;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.web.multipart.MultipartFile;
  15.  
  16. import com.jrbac.util.UUIDGenerator;
  17.  
  18. import net.coobird.thumbnailator.Thumbnails;
  19.  
  20. public class ImageService {
  21. private static final Logger logger = LoggerFactory.getLogger(ImageService.class);
  22.  
  23. /**
  24. * @param request
  25. * @param file
  26. * @param uploadPath
  27. * 形如这样的/assets/upload/image/
  28. * @return /assets/upload/image/abc.jpg
  29. * @throws IOException
  30. */
  31. public static String saveImage(HttpServletRequest request, MultipartFile file, String uploadPath) {
  32. // 如果用的是Tomcat服务器,则文件会上传到\\%TOMCAT_HOME%\\webapps\\YourWebProject\\uploadPath\\文件夹中
  33. // String fileName = file.getOriginalFilename();
  34. // String fileExt[] = fileName.split("\\.");
  35. String ext = file.getContentType().split("\\/")[1];
  36. String newFileName = UUIDGenerator.getUUID() + "." + ext;
  37. String realPath = request.getSession().getServletContext().getRealPath(uploadPath);
  38. String filePathAndName = null;
  39. if (realPath.endsWith(File.separator)) {
  40. filePathAndName = realPath + newFileName;
  41. } else {
  42. filePathAndName = realPath + File.separator + newFileName;
  43. }
  44. logger.info("-----上传的文件:{}-----", filePathAndName);
  45. try {
  46. // 先把文件保存到本地
  47. FileUtils.copyInputStreamToFile(file.getInputStream(), new File(realPath, newFileName));
  48. } catch (IOException e1) {
  49. logger.error("-----文件保存到本地发生异常:{}-----", e1.getMessage());
  50. }
  51. int big = 2 * 1024 * 1024; // 2M以上就进行0.6压缩
  52. if (file.getSize() > big) {
  53. thumbnail(filePathAndName, 0.6f);
  54. } else {
  55. thumbnail(filePathAndName, 0.8f);
  56. }
  57. return uploadPath + newFileName;
  58. }
  59.  
  60. private static void thumbnail(String filePathAndName, double size) {
  61. try {
  62. Thumbnails.of(filePathAndName).scale(size).toFile(filePathAndName);
  63. } catch (IOException e) {
  64. logger.error("-----读取图片发生异常:{}-----", e.getMessage());
  65. logger.info("-----尝试cmyk转化-----");
  66. File cmykJPEGFile = new File(filePathAndName);
  67. try {
  68. BufferedImage image = ImageIO.read(cmykJPEGFile);
  69. ImageOutputStream output = ImageIO.createImageOutputStream(cmykJPEGFile);
  70. if (!ImageIO.write(image, "jpg", output)) {
  71. logger.info("-----cmyk转化异常:{}-----");
  72. }
  73. Thumbnails.of(image).scale(0.4f).toFile(filePathAndName);
  74. logger.info("-----cmyk转化成功-----");
  75. } catch (IOException e1) {
  76. logger.info("-----cmyk转化异常:{}-----", e1.getMessage());
  77. }
  78. }
  79. }
  80. }

这里有一点需要解释一下

  1. FileUtils.copyInputStreamToFile(file.getInputStream(), new File(realPath, newFileName));

会将图片保存到本地,

这一步没问题

问题会发生在

  1. Thumbnails.of(filePathAndName).scale(size).toFile(filePathAndName);

大部分情况下是不会出问题的,如果

P过的图片保存为jpg格式时,默认的模式是CMYK模式

就会报如下错误

javax.imageio.IIOException: Unsupported Image Type

这里采用https://github.com/haraldk/TwelveMonkeys工具解决

参考文献

SpringMVC传值

imageIO异常:Unsupported Image Type, 不支持图像类型

java下cmyk图片读取和转换rgb

https://github.com/haraldk/TwelveMonkeys

分享一个上传图片,图片压缩Unsupported Image Type解决方案的更多相关文章

  1. Http POST 提交 415错误 Unsupported Media Type 解决方案

    1 问题 在调用webapi post 提交时出现 415 Unsupported Media Type 错误 前端代码如下: $.post("/api/student/poststuden ...

  2. 分享一个延迟加载图片的JS

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  3. 分享一个react 图片上传组件 支持OSS 七牛云

    react-uplod-img 是一个基于 React antd组件的图片上传组件 支持oss qiniu等服务端自定义获取签名,批量上传, 预览, 删除, 排序等功能 需要 react 版本大于 v ...

  4. vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理

    一.前言 三年.net开发转前端已经四个月了,前端主要用webpack+vue,由于后端转过来的,前端不够系统,希望分享下开发心得与园友一起学习. 图片的上传之前都是用的插件(ajaxupload), ...

  5. 分享图片压缩上传demo,可以选择一张或多张图片也可以拍摄照片

    2016-08-05更新: 下方的代码是比较OLD的了,是通过js进行图片的剪切 旋转 再生成,效率较低. 后来又整合了一个利用native.js本地接口的压缩代码 ,链接在这 .页面中有详细的说明, ...

  6. Android webview实现上传图片的效果(图片压缩)

    mainactivity代码 package com.bwie.webviewupload; import java.io.ByteArrayInputStream; import java.io.B ...

  7. 使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器

    使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器 ajax上传主要使用了 var reader = new FileReader() 此方法 js图片压缩主要是利用canvas进 ...

  8. 上传图片时压缩图片 - 前端(canvas)做法

    HTML前端代码: <?php $this->layout('head'); ?> <?php $this->layout('sidebar'); ?> <m ...

  9. $.ajax通路RESTful Web Service一个错误:Unsupported Media Type

    最近项目,使用头版jquery ajax访问背景CXF发布时间rest维修,结果遇到了错误"Unsupported Media Type". 公布的服务java代码例如以下: im ...

随机推荐

  1. openerp many2many

    many2many (0,0,{values}) 根据values里面的信息新建一个记录. (1,ID,{values})更新id=ID的记录(写入values里面的数据) (2,ID) 删除id=I ...

  2. 简单四步開始树莓派上的Docker之旅

    大概这篇博文发表之后,应该算是我个人的第一篇翻译作品了,翻译的可能不是非常到位,望各位看官大刀砍过来. 原文链接:http://resin.io/blog/docker-on-raspberry-pi ...

  3. python字符串格式化--dict传参

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python字符串格式化--dict传参 print "I'm %(name)s. I'm %(a ...

  4. glob 模块

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #glob 模块 #http://python.jobbole.com/81552/ #查找文件只用到三个匹配 ...

  5. Tomcat之配置HTTPS

    1. 在C:\Windows\System32\drivers\etc\hosts文件中新增一条项目web.demo.com,让Tomcat可以通过域名访问: 127.0.0.1 web.demo.c ...

  6. jquery添加用户 事例

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  7. InteliJ Idea通过maven创建webapp

    facet是IDE给工程添加的属性,在使用maven时一定不能使用facet 一.创建maven项目,选定webapp作为archtype,这样就会自动生成webapp目录 如果没有给maven设置代 ...

  8. 使用springboot遇到的的异常

    Unregistering JMX-exposed beans on shutdown <dependency> <groupId>org.springframework.bo ...

  9. 【LeetCode】43. Multiply Strings

    Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as a ...

  10. [转]Splay Tree

    转自:http://blog.sina.com.cn/s/blog_7c4c33190100sg9r.html Splay Tree(又叫伸展树)本质上也是一棵二叉查找树.它不是严格平衡的,但通过一种 ...