最近跟师父一起做一个需求,被分配到一个优化需求,将用户上传的图片做一份缩略图存储到阿里云服务器,再把地址存入数据库。
采用了Thumbnails框架对图片进行缩略处理。
由于第一次使用这个框架 参考了一篇非常有用的博客:
写的很通俗易懂,而这篇博客主要是记录自己实现这个功能的步骤流程及遇到问题的解决办法。
第一步:导入jar包
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
第二部:编写图片缩略的方法,其中上传到阿里云方法使用了之前同事写的方法
/***
* 图片缩略方法
*
* @param picture 图片
* @param length 长
* @param width 宽
* @param output 清晰程度
* @return 缩略后的图片
* @author dongwei.
* @date 2018/06/06.
*/
@Override
public String abbreviations(String picture, Integer length, Integer width, Float output) {
Random random = new Random();
File file = new File(random.nextInt(10000)+"abbreviatedPicture.jpg");
String s = AliyunOSSUtil.aliyunUrl + picture;
try {
Thumbnails.of(new URL(s)).size(length, width).outputQuality(output).toFile(file);
} catch (IOException e) {
e.printStackTrace();
}
ImgUtil util = new ImgUtil();
String alikey = util.storageLocalAliImg(file.getAbsolutePath());
return alikey;
}
/**
* 本地图片存储到阿里云
*/
public String storageLocalAliImg(String fileurl) {
// 上传到服务器的文件名
String alikey = "news-" + MathUtil.getTimeNumber() + ".jpg";
// 上传到阿里云
if (OSSObjectSample.storageAliImg(OSSObjectSample.aliimg_bucket, alikey, fileurl)) {
// 删除本地图片
File file = new File(fileurl);
file.delete();
return alikey;
}
return null;
}
其中 Thumbnails.of() 这个方法非常关键,之前参考博客时,使用的是本地的图片,缩略后的图片也是放在本地的,写完方法测试时才发现传进来的是一个URL地址,但是of这个方法却把这个地址当成了一个相对路径地址,自动给路径前面加上了项目所在的本地路径,然后去查询,最后折腾了好久,看了很多博客,都是一个基础的 Thumbnails 框架使用,使用的都是本地的图片,最后看源码才发现of()这个方法居然重载了5次,其中两个是传流对象的,一个是传String,一个传File,一个传URL地址,而我传进去的虽然是一个网页路径,但是却没有使用URL 进行包装,所以每次都是被当成了File类型,所以去了本地查找这张图片,结果自然是找不到。
所以,在使用of这个方法的时候一定要特别注意,看具体使用的是哪一个方法。
至于使用到的其他几个方法,网上有很多参考资料,就不说了。