阿里云 OSS 对象存储简单使用【随笔】
程序员文章站
2022-05-15 14:18:14
...
Aliyun OSS 对象存储的使用
官方文档:https://help.aliyun.com/document_detail/32008.html?spm=a2c4g.11186623.6.916.57fc6d39qyXFck
准备工作
一、首先开通阿里云 OSS 对象存储,并创建 Bucket 列表
二、创建完成后,点击进入 Bucket,在概览中可以看到外网访问地址 与 内网访问地址;若是本地开发测试可以使用外网地址,若是部署到服务器上的生产环境建议使用内网地址;内网地址上传速度远超外网且可以降低服务器的宽带需求。
三、进入文件管理,可以添加文件上传目录的分类,如下面我根据不同格式的文件进行分类。
四、权限管理页面可以设置防盗链等。
五、基础设置下面的生命周期可以设置文件存储的有效期,过期后会执行删除或转换存储类型。
六、传输管理下的域名管理可以将域名绑定到当前 Bucket 下,绑定后即可使用我们自己的域名访问 OSS;另外还可开启传输加速加快文件的传输速度【注意这个是需要收费的】。
七、创建一个单独赋予 OSS 权限的用户。鼠标移到我们的头像上,点击 RAM 访问控制;用户 --> 创建用户;点击创建的用户并设置权限,并创建 AccessKey
编码实现
导入 pom 依赖
<!--aliyun oss-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
<!--aliyun core-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.6</version>
</dependency>
创建
config.properties
配置文件
# 阿里云OSS用户**ID
oss.accessKeyID=前面创建的 AccessKey
# 阿里云OSS用户**
oss.accessKeySecret=前面创建的 AccessKeySecret
# 外网访问
oss.networkAccess=外网访问地址【主要用户生成上传文件的访问地址】
# 上传节点(外网)
oss.endpoint=上传节点【若是测试使用外网上传,若是生产环境使用内网上传】
# 上传节点 (内网)
#oss.endpoint=
创建 oss 工具类
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.comm.Protocol;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.util.Properties;
/**
* @author akieay
* @Date: 2020/11/19 0:30
*/
@Slf4j
public class OssConnectionUtil {
/**
* 阿里云OSS用户**ID
*/
private static String accessKeyID;
/**
* 阿里云OSS用户**
*/
private static String accessKeySecret;
/**
* 阿里云OSS外网访问节点
*/
private static String networkAccess;
/**
* OSS 上传访问节点
*/
private static String endpoint;
static {
Properties prop = new Properties();
try {
prop.load(Object.class.getResourceAsStream("/config.properties"));
accessKeyID = prop.getProperty("oss.accessKeyID");
accessKeySecret = prop.getProperty("oss.accessKeySecret");
networkAccess = prop.getProperty("oss.networkAccess");
endpoint = prop.getProperty("oss.endpoint");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取OSS实例对象
* @return
*/
public static OSS getOssClientInstance(){
OSS ossClient = null;
try {
// 创建ClientConfiguration。ClientConfiguration是OSSClient的配置类,可配置代理、连接超时、最大连接数等参数。
ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
// 设置OSSClient允许打开的最大HTTP连接数,默认为1024个。
conf.setMaxConnections(200);
// 设置Socket层传输数据的超时时间,默认为50000毫秒。
conf.setSocketTimeout(10000);
// 设置建立连接的超时时间,默认为50000毫秒。
conf.setConnectionTimeout(10000);
// 设置从连接池中获取连接的超时时间(单位:毫秒),默认不超时。
conf.setConnectionRequestTimeout(1000);
// 设置连接空闲超时时间。超时则关闭连接,默认为60000毫秒。
conf.setIdleConnectionTime(10000);
// 设置失败请求重试次数,默认为3次。
conf.setMaxErrorRetry(5);
// 设置是否支持将自定义域名作为Endpoint,默认支持。
conf.setSupportCname(true);
// 设置是否开启二级域名的访问方式,默认不开启。
// conf.setSLDEnabled(true);
// 设置连接OSS所使用的协议(HTTP或HTTPS),默认为HTTP。
conf.setProtocol(Protocol.HTTP);
// 设置用户代理,指HTTP的User-Agent头,默认为aliyun-sdk-java。
// conf.setUserAgent("aliyun-sdk-java");
// 设置代理服务器端口。
// conf.setProxyHost("<yourProxyHost>");
// 设置代理服务器验证的用户名。
// conf.setProxyUsername("<yourProxyUserName>");
// 设置代理服务器验证的密码。
// conf.setProxyPassword("<yourProxyPassword>");
// 设置是否开启HTTP重定向,默认开启。
conf.setRedirectEnable(true);
// 设置是否开启SSL证书校验,默认开启。
conf.setVerifySSLEnable(true);
ossClient = new OSSClientBuilder().build(endpoint, accessKeyID, accessKeySecret, conf);
} catch (Exception e) {
log.error("初始化client失败!exception:" + e.getMessage());
}
return ossClient;
}
/**
* 获取OSS外网访问域名
* @return
*/
public static String getOssNetworkAccess(){
return networkAccess;
}
}
创建 OSS 常量类
/**
* 阿里云 oss对象存储通用常量封装
* @author akieay
*/
public class OssConstant {
/**
* 创建的 Bucket 名称
*/
public static String CLOUDPRINT_FILE_BUCKET = "cloud-test";
/**
* word文件存储目录
*/
public static String WORD_DIRECTORY = "cloudprint/word/";
/**
* excel文件存储目录
*/
public static String EXCEL_DIRECTORY = "cloudprint/excel/";
/**
* ppt文件存储目录
*/
public static String PPT_DIRECTORY = "cloudprint/ppt/";
/**
* pdf文件存储目录
*/
public static String PDF_DIRECTORY = "cloudprint/pdf/";
/**
* txt文件存储目录
*/
public static String TXT_DIRECTORY = "cloudprint/txt/";
/**
* prn 文件存储目录
*/
public static String PRN_DIRECTORY = "cloudprint/prn/";
/**
* image 文件存储目录
*/
public static String IMAGE_DIRECTORY = "cloudprint/image/";
/**
* img-pdf 文件存储目录
*/
public static String IMG_PDF_DIRECTORY = "cloudprint/img-pdf/";
/**
* 授权URL访问的有效期(毫秒) 默认1小时
*/
public static Integer AUTH_URL_PERIOD_VALIDITY = 3600 * 1000;
}
创建 OSS API 工具类
import com.akieay.cloudprint.common.util.FileUtil;
import com.akieay.cloudprint.common.util.aliyun.oss.connection.OssConnectionUtil;
import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.OSS;
import com.aliyun.oss.model.*;
import java.io.*;
import java.net.URL;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.aliyun.oss.internal.OSSConstants.DEFAULT_OBJECT_CONTENT_TYPE;
/**
* @author akieay
*/
public class OssManagerApi {
public static OSS ossClient;
static {
ossClient = OssConnectionUtil.getOssClientInstance();
}
/**********************************************************存储空间管理************************************/
/**
* 创建存储空间
* @param bucketName 存储空间名称
*/
public static void createBucket(String bucketName){
// 创建CreateBucketRequest对象。
CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
// 如果创建存储空间的同时需要指定存储类型以及数据容灾类型, 可以参考以下代码。
// 此处以设置存储空间的存储类型为标准存储为例。
// createBucketRequest.setStorageClass(StorageClass.Standard);
// 默认情况下,数据容灾类型为本地冗余存储,即DataRedundancyType.LRS。如果需要设置数据容灾类型为同城冗余存储,请替换为DataRedundancyType.ZRS。
// createBucketRequest.setDataRedundancyType(DataRedundancyType.ZRS)
// 创建存储空间。
ossClient.createBucket(createBucketRequest);
}
/**
* 列举所有存储空间
* @return
*/
public static List<Bucket> listBuckets(){
// 列举存储空间。
return ossClient.listBuckets();
}
/**
* 判断存储空间是否存在
* @param bucketName 存储空间名称
* @return
*/
public static boolean bucketExists(String bucketName){
return ossClient.doesBucketExist(bucketName);
}
/**
* 删除存储空间
* @param bucketName 存储空间名称
*/
public static void removeBucket(String bucketName){
ossClient.deleteBucket(bucketName);
}
/******************************************************上传文件到指定的存储空间(bucketName)并将其保存为指定的文件名称(fileName)。************/
/**
* 简单上传-流式上传-【上传字符串】
* 上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
* @param bucketName 存储空间名称
* @param objectName 文件名称【全路径】
* @param content 文件内容[String格式]
*/
public static void simplyUploadString(String bucketName, String objectName, String content){
simplyUploadByteArray(bucketName, objectName, content.getBytes());
}
/**
* 简单上传-流式上传-【上传byte数组】
* @param bucketName 存储空间名称
* @param objectName 文件名称【全路径】
* @param content 文件内容[byte数组]
*/
public static void simplyUploadByteArray(String bucketName, String objectName, byte[] content){
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new ByteArrayInputStream(content));
// 如果需要上传时设置存储类型与访问权限,请参考以下示例代码。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);
ossClient.putObject(putObjectRequest);
}
/**
* 简单上传-流式上传-【上传网络流】
* @param bucketName 存储空间名称
* @param objectName 文件名称【全路径】
* @param url 网络文件url路径
*/
public static void simplyUploadFlowNetwork(String bucketName, String objectName, String url) throws Exception {
InputStream inputStream = new URL(url).openStream();
ossClient.putObject(bucketName, objectName, inputStream);
}
/**
* 简单上传-流式上传-【上传文件流】
* @param bucketName 存储空间名称
* @param objectName 文件名称【全路径】
* @param file 需要上传的文件对象
*/
public static void simplyUploadFile(String bucketName, String objectName, File file) throws FileNotFoundException {
InputStream inputStream = new FileInputStream(file);
ossClient.putObject(bucketName, objectName, inputStream);
}
/**
* 简单上传-文件上传
* @param bucketName 存储空间名称
* @param objectName 文件名称【全路径】
* @param filePath 本地文件路径
*/
public static void simplyUploadFile(String bucketName, String objectName, String filePath){
Map<String, String> tags = new HashMap<String, String>();
tags.put("tag", "cloudprint");
// 在HTTP header中设置标签信息。
ObjectMetadata metadata = new ObjectMetadata();
metadata.setObjectTagging(tags);
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath), metadata);
ossClient.putObject(putObjectRequest);
}
/**
* 简单上传-文件上传【存在回调函数】
* @param bucketName 存储空间名称
* @param objectName 文件名称【全路径】
* @param filePath 本地文件路径
* @param callback 回调对象
*/
public static void simplyUploadFile(String bucketName, String objectName, String filePath, Callback callback){
Map<String, String> tags = new HashMap<String, String>();
tags.put("tag", "cloudprint");
// 在HTTP header中设置标签信息。
ObjectMetadata metadata = new ObjectMetadata();
metadata.setObjectTagging(tags);
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath), metadata);
if(null != callback){
putObjectRequest.setCallback(callback);
}
ossClient.putObject(putObjectRequest);
}
/**
* 追加上传文件
* @param bucketName 存储空间名称
* @param objectName 文件名称【全路径】
* @param file 文件对象
* @param position 文件追加位置 第一次为0
* @return 下一次需要追加的文件的开始位置
*/
public static long additionalUploadFile(String bucketName, String objectName, File file, long position) {
AppendObjectRequest appendObjectRequest = new AppendObjectRequest(bucketName, objectName, file);
// 设置文件的追加位置。
appendObjectRequest.setPosition(position);
AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
return appendObjectResult.getNextPosition();
}
/**
* 使用签名URL临时授权文件上传
* @param bucketName 存储空间名称
* @param objectName 文件名称【全路径】
* @return 授权URL 字符串
*/
public static String getSignatureUrl(String bucketName, String objectName) {
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT);
// 设置URL过期时间为1小时。
Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
request.setExpiration(expiration);
// 设置ContentType。
request.setContentType(DEFAULT_OBJECT_CONTENT_TYPE);
// 设置自定义元信息。
request.addUserMetadata("token", "file_upload");
// 生成签名URL。
URL signedUrl = ossClient.generatePresignedUrl(request);
return signedUrl.toString();
// URL sto = new URL(signedUrl.toString());
// System.out.println("上传签名URL: "+signedUrl.toString());
//
// Map<String, String> requestHeaders = new HashMap<String, String>();
// requestHeaders.put(HttpHeaders.CONTENT_TYPE, DEFAULT_OBJECT_CONTENT_TYPE);
// requestHeaders.put(OSS_USER_METADATA_PREFIX + "token", "file_upload");
// // 使用签名URL上传文件。
// ossClient.putObject(sto, new ByteArrayInputStream("Hello OSS LLL".getBytes()), -1, requestHeaders, true);
// // 关闭OSSClient。
// ossClient.shutdown();
}
/********************************************下载文件;从OSS下载文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg******************/
/**
* 下载到本地文件
* @param bucketName 存储空间名称
* @param objectName 需要下载的文件名称 【全路径】
* @param localFile 下载后保存到本地的文件名称【全路径】
*/
public static void downloadLocalFile(String bucketName, String objectName, String localFile) {
// 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFile));
}
/**
* 下载文件;从OSS下载文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg
* @param bucketName 存储空间名称
* @param fileName 需要下载的文件名称 【全路径】
* @param localFile 下载后保存到本地的文件名称【全路径】
*/
public static File downloadFile(String bucketName, String fileName, String localFile) {
// 调用ossClient.getObject返回一个OSSObject实例,该实例包含文件内容及文件元信息。
OSSObject ossObject = ossClient.getObject(bucketName, fileName);
// 调用ossObject.getObjectContent获取文件输入流,可读取此输入流获取其内容。
InputStream content = null;
try {
content = ossObject.getObjectContent();
if (null != content) {
File file = new File(localFile);
FileUtil.inputStreamToFile(content, file);
return file;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != content) {
content.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
/*******************************************管理文件***************************************************************/
/**
* 判断文件是否存在
* @param bucketName 存储空间名称
* @param objectName 文件名称
* @return
*/
public static boolean fileExists(String bucketName, String objectName){
return ossClient.doesObjectExist(bucketName, objectName);
}
/**
* 删除文件
* @param bucketName 存储空间名称
* @param objectName 文件名称
*/
public static void removeFile(String bucketName, String objectName){
ossClient.deleteObject(bucketName, objectName);
}
/************************************************************************************************/
/**
* 获取上传文件的访问url【默认存储空间】
* @param filePath
* @return
*/
public static String getDefaultUploadFileUrl(String filePath){
return OssConnectionUtil.getOssNetworkAccess()+"/"+filePath;
}
}
创建 OSS 业务处理类,注意业务处理类按自己的需求编写
import com.akieay.cloudprint.common.util.aliyun.oss.api.OssManagerApi;
import com.akieay.cloudprint.common.util.aliyun.oss.constant.OssConstant;
/**
* @author akieay
*/
public class OssService {
/**
* 上传本地word源文件到 阿里云
* @param fileName 保存到阿里云的文件名称
* @param sourceFile 本地源文件全路径
* @return String 文件在阿里云上的存储目录
*/
public static String uploadLocalWordFile(String fileName, String sourceFile){
String objectName = OssConstant.WORD_DIRECTORY + fileName;
OssManagerApi.simplyUploadFile(OssConstant.CLOUDPRINT_FILE_BUCKET, objectName, sourceFile);
return OssManagerApi.getDefaultUploadFileUrl(objectName);
}
/**
* 上传本地excel源文件到 阿里云
* @param fileName 保存到阿里云的文件名称
* @param sourceFile 本地源文件全路径
* @return String 文件在阿里云上的存储目录
*/
public static String uploadLocalExcelFile(String fileName, String sourceFile){
String objectName = OssConstant.EXCEL_DIRECTORY + fileName;
OssManagerApi.simplyUploadFile(OssConstant.CLOUDPRINT_FILE_BUCKET, objectName, sourceFile);
return OssManagerApi.getDefaultUploadFileUrl(objectName);
}
/**
* 上传本地ppt源文件到 阿里云
* @param fileName 保存到阿里云的文件名称
* @param sourceFile 本地源文件全路径
* @return String 文件在阿里云上的存储目录
*/
public static String uploadLocalPptFile(String fileName, String sourceFile){
String objectName = OssConstant.PPT_DIRECTORY + fileName;
OssManagerApi.simplyUploadFile(OssConstant.CLOUDPRINT_FILE_BUCKET, objectName, sourceFile);
return OssManagerApi.getDefaultUploadFileUrl(objectName);
}
/**
* 上传本地pdf源文件到 阿里云
* @param fileName 保存到阿里云的文件名称
* @param sourceFile 本地源文件全路径
* @return String 文件在阿里云上的存储目录
*/
public static String uploadLocalPdfFile(String fileName, String sourceFile){
String objectName = OssConstant.PDF_DIRECTORY + fileName;
OssManagerApi.simplyUploadFile(OssConstant.CLOUDPRINT_FILE_BUCKET, objectName, sourceFile);
return OssManagerApi.getDefaultUploadFileUrl(objectName);
}
/**
* 上传本地txt源文件到 阿里云
* @param fileName 保存到阿里云的文件名称
* @param sourceFile 本地源文件全路径
* @return String 文件在阿里云上的存储目录
*/
public static String uploadLocalTxtFile(String fileName, String sourceFile){
String objectName = OssConstant.TXT_DIRECTORY + fileName;
OssManagerApi.simplyUploadFile(OssConstant.CLOUDPRINT_FILE_BUCKET, objectName, sourceFile);
return OssManagerApi.getDefaultUploadFileUrl(objectName);
}
/**
* 上传本地文件到 阿里云
* @param fileName 保存到阿里云的文件名称
* @param sourceFile 本地源文件全路径
* @param type 文件后缀名
* @return 文件在阿里云上的存储目录
*/
public static String uploadLocalFile(String fileName, String sourceFile, String type){
switch (type){
case ".doc":
case ".docx":
return uploadLocalWordFile(fileName, sourceFile);
case ".xls":
case ".xlsx":
return uploadLocalExcelFile(fileName, sourceFile);
case ".ppt":
case ".pptx":
return uploadLocalPptFile(fileName, sourceFile);
case ".pdf":
return uploadLocalPdfFile(fileName, sourceFile);
case ".txt":
return uploadLocalTxtFile(fileName, sourceFile);
case ".jpg":
return uploadLocalImageFile(fileName, sourceFile);
default:
return null;
}
}
/**
* 上传本地prn源文件到 阿里云
* @param fileName 保存到阿里云的文件名称
* @param sourceFile 本地源文件全路径
* @return String 文件在阿里云上的存储目录
*/
public static String uploadLocalPrnFile(String fileName, String sourceFile){
String objectName = OssConstant.PRN_DIRECTORY + fileName;
OssManagerApi.simplyUploadFile(OssConstant.CLOUDPRINT_FILE_BUCKET, objectName, sourceFile);
return OssManagerApi.getDefaultUploadFileUrl(objectName);
}
/**
* 上传本地image源文件到 阿里云
* @param fileName 保存到阿里云的文件名称
* @param sourceFile 本地源文件全路径
* @return String 文件在阿里云上的存储目录
*/
public static String uploadLocalImageFile(String fileName, String sourceFile){
String objectName = OssConstant.IMAGE_DIRECTORY + fileName;
OssManagerApi.simplyUploadFile(OssConstant.CLOUDPRINT_FILE_BUCKET, objectName, sourceFile);
return OssManagerApi.getDefaultUploadFileUrl(objectName);
}
/**
* 上传本地image的pdf文件源文件到 阿里云
* @param fileName 保存到阿里云的文件名称
* @param sourceFile 本地源文件全路径
* @return String 文件在阿里云上的存储目录
*/
public static String uploadLocalImgPdfFile(String fileName, String sourceFile){
String objectName = OssConstant.IMG_PDF_DIRECTORY + fileName;
OssManagerApi.simplyUploadFile(OssConstant.CLOUDPRINT_FILE_BUCKET, objectName, sourceFile);
return OssManagerApi.getDefaultUploadFileUrl(objectName);
}
/**
* 获取image文件上传临时授权的 url
* @param fileName image文件名称
* @return image 临时授权的url
*/
public static String getImageSignatureUrl(String fileName){
String objectName = OssConstant.IMAGE_DIRECTORY + fileName;
return OssManagerApi.getSignatureUrl(OssConstant.CLOUDPRINT_FILE_BUCKET, objectName);
}
/**
* 删除 image 文件存储目录 的指定名称的文件
* @param fileName 文件名称
*/
public static void removeImageFile(String fileName){
OssManagerApi.removeFile(OssConstant.CLOUDPRINT_FILE_BUCKET, OssConstant.IMAGE_DIRECTORY + fileName);
}
/**
* 获取文件在 aliyun 的访问目录url
* @param fileName 文件名
* @param fileName 文件存储目录
* @return 阿里云访问url
*/
public static String getPrnFileUrl(String fileName, String fileDir){
String objectName = fileDir + fileName;
return OssManagerApi.getDefaultUploadFileUrl(objectName);
}
}
测试 OSS 上传
import com.akieay.cloudprint.common.util.aliyun.oss.OssService;
public class Test {
public static void main(String[] args) throws Exception {
String url = OssService.uploadLocalPdfFile("tes-tword-upload.pdf", "C:\\Users\\admin\\Desktop\\pdf\\tes-tword-upload.pdf");
System.out.println(url);
}
}
调用上传后,即可在 OSS 文件目录下查看上传的文件
下一篇: pwnable.kr-passcode