本文讲解的是java如何实现上传文件到oss中去,并通过代码设置上传文件的属性是私有还是公开,是在线预览还是文件下载,闲言少叙,码归正传
1、我们得先开通阿里云的oss服务,这个在这里就不叙说了,有感兴趣的小伙伴自行百度。
2、接入oss服务
2.1 pom依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
2、yam中阿里云服务配置,这里的id和secret可以使用子用户的Accesskey,限制使用者的使用范围
aliyun:
oss:
endpoint: oss-cn-chengdu.aliyuncs.com
keyId: xxxx
keySecret: xxxx
bucketName: xxxxx
3、编写上传代码,上传文件的方式有很多种,本文使用流文件上传
3.1获取配置信息
/**
* oss配置信息
*/
@Component
@ConfigurationProperties("aliyun.oss")
public class OssProperties {
/**
* 填写Bucket所在地域对应的Endpoint
*/
private String endpoint;
/**
* AccessKey的id
*/
private String keyId;
/**
* AccessKey的密钥
*/
private String keySecret;
/**
* 阿里云储存文件的Bucket名称
*/
private String bucketName;
public String getEndpoint() {
return endpoint;
}
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
public String getKeyId() {
return keyId;
}
public void setKeyId(String keyId) {
this.keyId = keyId;
}
public String getKeySecret() {
return keySecret;
}
public void setKeySecret(String keySecret) {
this.keySecret = keySecret;
}
public String getBucketName() {
return bucketName;
}
public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
}
3.2编写上传逻辑,下面通过请求传入的参数判断上传的文件权限是私有还是公开,以及区分获取两种方式的文件地址
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import java.io.InputStream;
import java.net.URL;
public class Demo {
@Resource
private OssProperties ossProperties;
/**
* 上传文件
*
* @param inputStream 上传的文件
* @param module oss目录
* @param originalFilename 文件名称
* @param fileType 文件类型 private 私有,public 共有
* @return
*/
public Map upload(InputStream inputStream, String module, String originalFilename, String fileType) {
/**
* 获取oss的属性
*/
String endpoint = ossProperties.getEndpoint();
String accessKeyId = ossProperties.getKeyId();
String accessKeySecret = ossProperties.getKeySecret();
String bucketName = ossProperties.getBucketName();
String objectName = "";
Map<String, Object> map = new HashMap<>();
// 创建上传文件的元信息,可以通过文件元信息设置HTTP header。
ObjectMetadata meta = new ObjectMetadata();
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
String folder = new DateTime().toString("yyyy/MM/dd");
// 文件名
String fileName = UUID.randomUUID().toString();
//文件扩展名
String fileExtention = originalFilename.substring(originalFilename.lastIndexOf("."));
if (StringUtils.isNotEmpty(module)) {
//最终的路径 类似avatar/2021/12/05/xxxxxxxxx.jpg
objectName = module + "/" + folder + "/" + fileName + fileExtention;
} else {
objectName = folder + "/" + fileName + fileExtention;
}
meta.setContentType("text/plain");
meta.setContentDisposition("inline");
// 设置存储空间的读写权限。例如将examplebucket的读写权限ACL设置为私有Private。
// ossClient.setBucketAcl(bucketName, CannedAccessControlList.Private);
if ("private".equals(fileType)) {
//将文件访问读写权限设置为私有
meta.setObjectAcl(CannedAccessControlList.Private);
// 上传文件
ossClient.putObject(bucketName, objectName, inputStream, meta);
// 设置签名URL过期时间,单位为毫秒。
Date expiration = new Date(new Date().getTime() + 3600 * 1000);
// 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
String url = ossClient.generatePresignedUrl(bucketName, objectName, expiration).toString();
map.put("fileUrl", url);
return map;
}
// 上传文件
ossClient.putObject(bucketName, objectName, inputStream, meta);
//https://rxt.oss-cn-beijing.aliyuncs.com/avatar/01.jpeg
endpoint = endpoint.split("//")[1];
map.put("fileUrl", "https://" + bucketName + "." + endpoint + "/" + objectName);
return map;
} catch (OSSException oe) {
throw new ServiceException(oe.getMessage());
} catch (ClientException ce) {
throw new ServiceException(ce.getMessage());
} finally {
if (ossClient != null) {
// 关闭OSSClient。
ossClient.shutdown();
}
}
}
}
好了oss上传文件逻辑就是这么简单。这些东西在官方文档中都能够找到。希望能够帮助到大家