OSS文件上传和STStoken临时授权访问
整了好几天,从OSS角色权限配置到代码,整的脑壳痛,终于好了。
配置就不在这里展开了,都搜得到。
话不多说,上代码。差不多也是网上代码整理的。
文件上传
/**
* 存储文件到oss服务器
* 返回保存路径(自定义路径+文件名)。
*
* @return
* @throws Exception
*/
public static String ossSave(MultipartFile file, String path) throws IOException {
if (file != null) {
// 文件原始名称
String originalFilename = file.getOriginalFilename();
// 上传图片
if (originalFilename != null && originalFilename.length() > 0) {
try {
// 文件名称
String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
// 新文件
//按日期存储
String date_path = "/" + new DateTime().toString("yyyy/MM/dd");
//path + filename
String filename = OssUtils.objectName + path + date_path + "/" + newFileName;
//创建oss实例
OSS ossClient = new OSSClientBuilder().build(OssUtils.endpoint, OssUtils.accessKeyId, OssUtils.accessKeySecret);
//设置元信息 没有这个参数,访问文件时会变成下载文件。 元信息文档:https://help.aliyun.com/document_detail/31859.htm?spm=a2c4g.11186623.2.2.5e963686lk09hW#concept-lkf-swy-5db
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType(FileUtil.getContentType(newFileName));
//上传文件流
InputStream inputStream = file.getInputStream();
//调用oss方法实现上传
//第一个参数 Bucket名称
//第二个参数 上传到oss 文件路径和文件名称
//第三个参数 上传文件输入流
//第四个参数 设置元信息
ossClient.putObject(OssUtils.bucketName, filename, inputStream, objectMetadata);
//关闭ossclient
ossClient.shutdown();
//返回上传之后文件路径
return /*"https://" + OssUtils.bucketName + "." + OssUtils.endpoint + */"/" + filename;
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
}
return null;
}
根据保存路径获取oss文件临时访问权限STStoken
/**
*
* @param url example: /file/a.jpg
* @return Expires + OSSAccessKeyId + Signature
*/
public static String getSTSToken(String url) {
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
Date date = new Date(System.currentTimeMillis() + 15 * 60 * 1000);
URL newUrl = ossClient.generatePresignedUrl(bucketName, url.substring(1), date);
String ossUrl = newUrl.toString();
ossClient.shutdown();
return ossUrl.split("\\?")[1];
}
获取文件类型方法
public static String getContentType(String FilenameExtension) {
if (FilenameExtension.equalsIgnoreCase(".bmp")) {
return "image/bmp";
}
if (FilenameExtension.equalsIgnoreCase(".gif")) {
return "image/gif";
}
if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
FilenameExtension.equalsIgnoreCase(".jpg") ||
FilenameExtension.equalsIgnoreCase(".png")) {
return "image/jpg";
}
if (FilenameExtension.equalsIgnoreCase(".html")) {
return "text/html";
}
if (FilenameExtension.equalsIgnoreCase(".txt")) {
return "text/plain";
}
if (FilenameExtension.equalsIgnoreCase(".vsd")) {
return "application/vnd.visio";
}
if (FilenameExtension.equalsIgnoreCase(".pptx") ||
FilenameExtension.equalsIgnoreCase(".ppt")) {
return "application/vnd.ms-powerpoint";
}
if (FilenameExtension.equalsIgnoreCase(".docx") ||
FilenameExtension.equalsIgnoreCase(".doc")) {
return "application/msword";
}
if (FilenameExtension.equalsIgnoreCase(".xml")) {
return "text/xml";
}
return "image/jpg";
}
访问
方式一:OSS外网地址+OSS文件路径。该方式会暴露bucket地址(不推荐)
bucketName + endpoint + filename
方式二:nginx 代理OSS外网地址访问,隐藏你的bucket地址,相对安全一些(推荐)
方式三:ECS 代理OSS内网地址访问(强烈推荐)
优点:1.可掩盖OSS原始路径,安全;2.通过同地域ECS访问OSS,不收流量费
缺点:OSS访问的速度受限于ECS的带宽
nginx 代理访问配置
请参考: