使用阿里云oss对象存储实现文件上传
这里就先不讲阿里云对象存储开通,主要讲讲代码实现文件上传
1、首先导入需要用到的依赖
<!--阿里云对象存储依赖-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.1.0</version>
</dependency>
<!--日期类进行格式转换依赖-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.8</version>
</dependency>
2、在yml配置文件中写入文件上传用到的属性
oss:
//Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
endpoint: oss-cn-hangzhou.aliyuncs.com
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
keyid:
//自己对象存储的密钥
keysecret:
// 填写Bucket名称,例如examplebucket。
bucketname: hongwen
3、业务层实现文件上传功能
@Service
public class UploadServiceImpl implements UploadService {
@Value("${oss.endpoint}")
private String endpoint;
@Value("${oss.accessKeyId}")
private String accessKeyId;
@Value("${oss.accessKeySecret}")
private String accessKeySecret;
@Value("${oss.bucketName}")
private String bucketName;
@Override
public String upload(MultipartFile file) {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
String originalFilename = file.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//使用UUID重新生成文件名,防止文件名重复造成文件覆盖
String fileName = UUID.randomUUID().toString() + suffix;
//根据时间对文件进行分组,这里我们用到一个日期转换依赖
String datePath = new DateTime().toString("yyyy/MM/dd");
fileName=datePath+"/"+fileName;
InputStream inputStream = file.getInputStream();
// 创建PutObject请求。
ossClient.putObject(bucketName,fileName, inputStream);
//返回文件地址
String url = "https://" + bucketName + "." + endpoint + "/" + fileName;
return url;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
至此就完成了文件上传功能,将一个文件上传后结果如图: