OSSClient 已過時,最新版的OSS SDK 插件進行文件上傳
1、上傳形式
- 流式上傳
- 上傳字符串
- 上傳Byte 數組
- 上傳網絡流
- 上傳文件流
- 文件上傳
2、上傳字符串
// Endpoint以杭州爲例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建並使用RAM賬號進行API訪問或日常運維,請登錄 https://ram.console.aliyun.com 創建RAM賬號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
// 創建OSSClient實例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 創建PutObjectRequest對象。
String content = "Hello OSS";
// <yourObjectName>表示上傳文件到OSS時需要指定包含文件後綴在內的完整路徑,例如abc/efg/123.jpg。
PutObjectRequest putObjectRequest = new PutObjectRequest("<yourBucketName>", "<yourObjectName>", new ByteArrayInputStream(content.getBytes()));
// 如果需要上傳時設置存儲類型與訪問權限,請參考以下示例代碼。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);
// 上傳字符串。
ossClient.putObject(putObjectRequest);
// 關閉OSSClient。
ossClient.shutdown();
3、上傳Byte數組
// Endpoint以杭州爲例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建並使用RAM賬號進行API訪問或日常運維,請登錄 https://ram.console.aliyun.com 創建RAM賬號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
// 創建OSSClient實例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);
// 上傳Byte數組。
byte[] content = "Hello OSS".getBytes();
ossClient.putObject("<yourBucketName>", "<yourObjectName>", new ByteArrayInputStream(content));
// 關閉OSSClient。
ossClient.shutdown();
4、上傳網絡流
// Endpoint以杭州爲例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建並使用RAM賬號進行API訪問或日常運維,請登錄 https://ram.console.aliyun.com 創建RAM賬號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
// 創建OSSClient實例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上傳網絡流。
InputStream inputStream = new URL("https://www.aliyun.com/").openStream();
ossClient.putObject("<yourBucketName>", "<yourObjectName>", inputStream);
// 關閉OSSClient。
ossClient.shutdown();
5、上傳文件流
// Endpoint以杭州爲例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 雲賬號AccessKey有所有API訪問權限,建議遵循阿里雲安全最佳實踐,創建並使用RAM子賬號進行API訪問或日常運維,請登錄 https://ram.console.aliyun.com 創建。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
// 創建OSSClient實例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上傳文件流。
InputStream inputStream = new FileInputStream("<yourlocalFile>");
ossClient.putObject("<yourBucketName>", "<yourObjectName>", inputStream);
// 關閉OSSClient。
ossClient.shutdown();
6、上傳本地文件
// Endpoint以杭州爲例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建並使用RAM賬號進行API訪問或日常運維,請登錄 https://ram.console.aliyun.com 創建RAM賬號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
// 創建OSSClient實例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 創建PutObjectRequest對象。
PutObjectRequest putObjectRequest = new PutObjectRequest("<yourBucketName>", "<yourObjectName>", new File("<yourLocalFile>"));
// 如果需要上傳時設置存儲類型與訪問權限,請參考以下示例代碼。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);
// 上傳文件。
ossClient.putObject(putObjectRequest);
// 關閉OSSClient。
ossClient.shutdown();
7、組件封裝
所需的pom 依賴
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.6.0</version>
</dependency>
1、構建屬性類
@Data
@RefreshScope
public class OssProperties {
@Value("${plugin.oss.end-point}")
private String endPoint;
@Value("${plugin.oss.access-key-id}")
private String accessKeyId;
@Value("${plugin.oss.access-key-secret}")
private String accessKeySecret;
@Value("${plugin.oss.bucket}")
private String bucket;
@Value("${plugin.oss.host}")
private String host;
}
2、構建dir,使用枚舉更合適,可以自行修改
/**
* @author Created by 譚健 on 2019/12/25. 星期三. 10:59.
* © All Rights Reserved.
*
* oss 上傳必須使用此類進行路徑鎖定
*/
public class OssDir {
}
3、上傳組件
/**
* @author Created by 譚健 on 2018/12/3. 星期一. 16:32.
* © All Rights Reserved.
* <p>
* oss 上傳組件
*/
@Slf4j
public class OssComponent {
private final OssProperties ossProperties;
public OssComponent(OssProperties ossProperties) {
this.ossProperties = ossProperties;
}
/**
* 進行文件上傳,支持各種形式的流
*
* @param inputStream 輸入流
* @return 返回上傳後的對象url 地址
*/
public String simpleUpload(InputStream inputStream, String suffix, String dir) {
if (inputStream == null) {
log.error("通過OSS 流式上傳時,輸入流爲空");
return "";
}
String filename = dir + UUID.randomUUID() + "." + suffix;
this.put(filename, inputStream);
return resourceUrl(filename);
}
/**
* 上傳某個鏈接地址的內容
*/
@SneakyThrows(Exception.class)
public String uploadUrl(String url, String suffix, String dir) {
return simpleUpload(new URL(url).openStream(), suffix, dir);
}
/**
* 構建請求對象
*
* @param filename 文件名
* @param inputStream 流
*/
private PutObjectRequest buildRequest(String filename, InputStream inputStream) {
return new PutObjectRequest(ossProperties.getBucket(), filename, inputStream);
}
/**
* 構建oss 組件
*/
private OSS buildOss() {
return new OSSClientBuilder().build(
ossProperties.getEndPoint(), ossProperties.getAccessKeyId(), ossProperties.getAccessKeySecret());
}
/**
* 設置存儲類型與訪問權限
*
* @param request 文件請求
*/
private static PutObjectRequest jurisdiction(PutObjectRequest request) {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
metadata.setObjectAcl(CannedAccessControlList.PublicRead);
request.setMetadata(metadata);
return request;
}
/**
* 獲取上傳到 oss 後文件的鏈接
*/
private String resourceUrl(String filename) {
return ossProperties.getHost() + ossProperties.getBucket() + "." + ossProperties.getEndPoint() + "/" + filename;
}
/**
* 把文件傳到 oss
*/
private void put(String filename, InputStream inputStream) {
OSS ossClient = this.buildOss();
ossClient.putObject(
jurisdiction(
this.buildRequest(filename, inputStream)
)
);
ossClient.shutdown();
}
@PostConstruct
public void init() {
log.info("oss 組件被加載到項目中");
}
}
4、構建啓動器
@Import({
OssComponent.class,
OssProperties.class
})
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface EnableOss {
}