使用阿里云OSS存储文件
使用阿里云OSS存储文件
- 创建 bucket (存储空间)
存储类型选择 低频访问存储
同城冗余存储选择 关闭
版本控制选择 不开通
读写权限选择 公共读写
服务端加密方式选择 无
实时日志查询选择 不开通
- 创建 RAM 账号
勾选 控制台访问 和 编程访问
控制台密码选择 自动生成默认密码
要求重置密码选择 无需重置
多因素认证选择 无需开启
- 确定创建后,将进入以下页面,注意保存 AccessKey 信息(关闭该页面后将不再显示)
- 创建 用户组,并授予 OSS 相关权限,将刚刚创建的 RAM 账号添加进该用户组
在项目中添加以下依赖:
com.aliyun.oss
aliyun-sdk-oss
3.10.2
joda-time
joda-time
2.9.9 在application.yml 中添加 endpoint 和 accessKey 相关信息
注:endpoint 必须与 创建的 bucket 所在区域保持一致,我这里选择的是杭州节点
alioss:
endpoint: oss-cn-hangzhou.aliyuncs.com
accessKeyId: LTAI4G8eXoyQNb7iJ7ZyyWkL
accessKeySecret: pwnebkgnxaTjjP21EFoeFaFdCmWeUD
bucketName: blu-bucket-test
可以在之前创建的 bucket 中查找到 与之对应的 endpoint 信息:
创建 OssEntity 实体类,绑定配置文件中的 accessKey 信息,并加上 @Component 注解
@Data
@Component
@ConfigurationProperties(prefix = “alioss”)
public class OssEntity {private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
AliOssService 接口
package com.blu.service;
import java.io.IOException;
import org.springframework.web.multipart.MultipartFile;
public interface AliOssService {
/** * 创建存储空间bucket */
void createBucket();
/** * 上传文件 */
String upload(MultipartFile file);
/** * 下载文件 */
void download(String fileName) throws IOException;
/** * 列举文件 */
void listFile();
/** * 删除文件 */
void deleteFile(String fileName);
}
AliOssServiceImpl
package com.blu.service.Impl;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.UUID;import org.joda.time.DateTime;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import com.aliyun.oss.model.ObjectMetadata;
import com.blu.entity.OssEntity;
import com.blu.service.AliOssService;@Service
public class AliOssServiceImpl implements AliOssService,InitializingBean {@Autowired
private OssEntity ossEntity;
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
/** * 初始化Bean之后需要进行的操作 */
@Override
public void afterPropertiesSet() throws Exception {
endpoint = ossEntity.getEndpoint();
accessKeyId = ossEntity.getAccessKeyId();
accessKeySecret = ossEntity.getAccessKeySecret();
bucketName = ossEntity.getBucketName();
}
@Override
public void createBucket() {
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);
if(ossClient.doesBucketExist(bucketName)) {
throw new RuntimeException(bucketName+ "在对象存储的Bucket列表中已经存在");
} else {
ossClient.createBucket(bucketName);
}
ossClient.shutdown();
}
@Override
public String upload(MultipartFile file) {
String uploadUrl = null;
try {
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
if(!ossClient.doesBucketExist(bucketName)){
//创建Bucket
ossClient.createBucket(bucketName);
//设置bucket的属性为公共读
ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
}
//获取上传的文件流
InputStream inputStream = file.getInputStream();
//构建日期的文件夹路径 avator/2020/10/14/文件名
String datePath = new DateTime().toString("yyyy/MM/dd");
//获取上传文件的全名称
String originalFilename = file.getOriginalFilename();
//获取UUID,并去除横杠 a98059d4-633c-4b55-b310-93c997cf8038
String fileName = UUID.randomUUID().toString().replaceAll("-", "");
//获取上传文件的扩展名
String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));
//拼接文件名称
String newName = fileName + fileType;
//生成文件夹+文件名 avator/2020/10/14/a98059d4633c4b55b31093c997cf8038.jpg
fileName = datePath + "/" + newName;
//如果想要实现图片预览的效果,一定要设置以下几点:
//1.设置文件的ACL(权限)为公共读或公共读写
//2.设置文本类型(image/jpg)
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setObjectAcl(CannedAccessControlList.PublicRead);
objectMetadata.setContentType(getContentType(fileType));
//上传文件
ossClient.putObject(bucketName,fileName,inputStream,objectMetadata);
//关闭ossClient
ossClient.shutdown();
//默认十年不过期
Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
uploadUrl = ossClient.generatePresignedUrl(bucketName, fileName, expiration).toString();
} catch (IOException e) {
e.printStackTrace();
}
return uploadUrl.substring(0,uploadUrl.indexOf("?"));
}
@Override
public void download(String fileName) throws IOException {
}
@Override
public void listFile() {
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ObjectListing objectListing = ossClient.listObjects(bucketName);
for (OSSObjectSummary ossObjectSummary : objectListing.getObjectSummaries()) {
System.out.println("-"+ossObjectSummary.getKey()+" "+"(size = "+ ossObjectSummary.getSize() + ")");
}
//关闭ossClient
ossClient.shutdown();
}
@Override
public void deleteFile(String fileName) {
String objectName = fileName;
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.deleteObject(bucketName,objectName);
ossClient.shutdown();
}
public static String getContentType(String FilenameExtension) {
if (FilenameExtension.equalsIgnoreCase(".bmp")) {
return "image/bmp";
}
if (FilenameExtension.equalsIgnoreCase(".gif")) {
return "image/gif";
}
if (FilenameExtension.equalsIgnoreCase(".jpg")) {
return "image/jpg";
}
if (FilenameExtension.equalsIgnoreCase(".png")) {
return "image/png";
}
if (FilenameExtension.equalsIgnoreCase(".jpeg")) {
return "image/jpeg";
}
if (FilenameExtension.equalsIgnoreCase(".vsd")) {
return "application/vnd.visio";
}
if (FilenameExtension.equalsIgnoreCase(".pptx")) {
return "application/vnd.ms-powerpoint";
}
if (FilenameExtension.equalsIgnoreCase(".ppt")) {
return "application/vnd.ms-powerpoint";
}
if (FilenameExtension.equalsIgnoreCase(".docx")) {
return "application/msword";
}
if (FilenameExtension.equalsIgnoreCase(".doc")) {
return "application/msword";
}
if (FilenameExtension.equalsIgnoreCase(".xml")) {
return "text/xml";
}
if (FilenameExtension.equalsIgnoreCase(".html")) {
return "text/html";
}
if (FilenameExtension.equalsIgnoreCase(".txt")) {
return "text/plain";
}
return "text/plain";
}
}
还没有评论,来说两句吧...