Fork me on GitHub

OSS 图片获取、缩略图/预览图获取 ?x-oss-process=image

 

提醒:上传的图片最大长宽必须在3万(单位应该是像素),超过三万的可以上传,但是显示会有问题,会报错,报错信息如下所示:

 

 

 

OSS对象存储中图片的缩略图/预览图获取

1、简单的原图、缩略图请求方式如下:

/**
 * @Author qtl
 * @Description 
 * @Date 15:29 2020/9/29
 * @Param [fileName]
 * @return java.lang.String
 **/
public static String getOSSFileUrl(String fileName){
  if (!StringUtils.isEmpty(fileName)) {
    String url = "https://OSS空间名.oss-cn-hangzhou.aliyuncs.com/文件存储目录/" + fileName + "?x-oss-process=image/resize,m_lfit,h_60,w_60";
    return url;
  }else{
    return "";
  }
}

注意事项 / 解释:

  1. 首先,需要注意的是此种方式的使用需要OSS对象存储空间是公共的可读的,否则(不是公共可读的)需要在请求路径后拼接签名验证信息;
  2. 传入的参数【fileName】是指在要获取的OSS对象存储空间中的文件名;
  3. 【url】路径的拼接:
    1. https://后拼接的是OSS对象存储空间的空间名;
    2. 空间名后加上此空间所在的地区路径(.oss-cn-hangzhou.aliyuncs.com);
    3. 地区路径后就是文件所在OSS对象存储上的路径了,最后再拼上文件名;(此时即可获得图片原图的访问路径了,如果需要获取图片的预览图,继续进行下一步的拼接即可;)
    4. 获取预览图时只需要拼接此代码即可:+ "?x-oss-process=image/resize,m_lfit,h_60,w_60"   (需要注意的是此中缩略图是以60像素为基础百分比进行缩放的,也就是说,以较长边为60px,进行整体缩放,不会出现缩放后变形的问题,另外还有其他方式的缩放,具体请看阿里云官方文档:https://help.aliyun.com/document_detail/44688.html?spm=a2c4g.11186623.4.2.713e3bc2T2qLbM

 

第二种:复杂的获取原图、缩略图请求方式如下:

之所以复杂是因为OSS对象存储空间是私密的,需要加上秦明进行验证和连接超时设定,而连接超时设定又涉及到一个问题,那就是缓存的问题,下面进行总结时会详细讲述;

// endpoint
private static String endpoint="https://oss-cn-hangzhou.aliyuncs.com";
// accessKey
private static String accessKeyId="xxx";
private static String accessKeySecret="xxx";
// OSS对象存储空间名
private static String bucketName="webplus-cn-hangzhou-s-xxxxxxxxx";
// 文件存储目录
private static String fileDir = "xxx/xxx/";

// 连接OSS服务实例
public OSSUpload() {
  ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
}

  /** * @Author qtl * @Description * @Date 15:29 2020/9/29 * @Param [fileName] * @return java.lang.String **/ public static String imageAbbreviation(String fileName){ if (!StringUtils.isEmpty(fileName)) { String[] split = fileName.split("/"); // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 将图片缩放为60px后。 String style = "image/resize,m_lfit,h_60,w_60"; // 指定签名URL过期时间为10分钟。 Date expiration = new Date(new Date().getTime() + 1000 * 60 * 10);
       // 创建请求对象 GeneratePresignedUrlRequest req
= new GeneratePresignedUrlRequest(bucketName, fileDir + split[split.length - 1], HttpMethod.GET);
       // 对请求对象追加过期时长 req.setExpiration(expiration);
       // 对请求对象追加样式 req.setProcess(style);
       // 生成最终访问路径 URL signedUrl
= ossClient.generatePresignedUrl(req); // 关闭OSSClient。 ossClient.shutdown(); return signedUrl.toString(); }else{ return ""; } }

注意事项 / 解释:

  • 创建OSSClient实例中需要有三个参数,分别是【endpoint:OSS对象存储服务器所在区路径,
这个路径可以在OSS服务器的控制台上找到】,【accessKeyId、accessKeySecret:是访问阿里云
API 的密钥,尽量不要使用主密钥,创建一个 RAM 子账号并配上访问资源权限即可】;

 

    

 

 

  •  设定缩放宽高,只需要修改其中的数字进行调整即可;
  • 指定访问路径过期时间,需要注意的是私人性质的OSS对象存储空间在创建访问请求时必须要设定过期时间,否者会报错,设定时间时从毫秒开始计算;
  • 创建请求对象步骤中需要将OSS对象存储空间名称【bucketName】、文件所在文件夹路径【fileDir】也要添加上,最后再将请求超时时长和图片样式追加到请求对象上即可;
  • 最后,不要忘记关闭OSS连接对象!

 

总结:

  这两种方式的大概区别已经在上面简单的叙述过了,所以简单的讲一下这两种方式的利弊:

  • 第一种方式,简单便捷,但是因为是公共读的权限,因此对于保密性较高的数据不太友好,但是对于保密性不高的数据很好,因为这种请求连接是固定的,也就是说一个文件的访问链接在文件不移动的情况下是一直有效的,可以进行缓存;
  • 第二种,操作复杂,是私密读的权限,安全性较高,但是无法进行缓存操作,因为数据的每次请求都需要对请求连接追加超时时间的,即使是同一个文件的请求每次也都不同,因此有缓存需求的用这种方式行不通;

 

pass:这些代码是之前写的,有同学发现存在问题或者有不懂的可以@我,看到后必回;

 

posted @ 2020-11-18 16:40  90后程序猿  阅读(11421)  评论(0编辑  收藏  举报
/* 看板娘 */