aliyun-Oss的介紹與使用
接上文aliyun-oss-01
1 Oss基于Java的使用(Java-SDK)
1.1 maven中引入
<!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.11.3</version>
</dependency>
1.1.1 如果是java9 及以上的版本則需要引入jaxb相關依賴,添加jaxb相關依賴示例代碼如下:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
1.2 OssClient使用
OSSClient是OSS的Java客戶端,用于管理存盤空間和檔案等OSS資源,使用Java SDK發起OSS請求,您需要初始化一個OSSClient實體,并根據需要修改ClientConfiguration的默認配置項,
1.2.1所需引數
@Value("${oss.endpoint}")
private String endpoint;
@Value("${oss.AccessKeyID}")
private String accessKeyID;
@Value("${oss.AccessKeySecret}")
private String accessKeySecret;
@Value("$oss.bucketName")
private String bucketName;
1.2.2新建OSSClient
這的Oss 用完之后 是需要關閉的,如果不關閉,會造成記憶體泄露
/**
* 使用OSS域名新建OSSClient(其中之一)
*
* @return OssClient
*/
public OSS ossClientCreate() {
final OSS build = new OSSClientBuilder().build(endpoint, accessKeyID, accessKeySecret);
log.info("OSSClient 新建成功");
return build;
}
1.2.3創建一個bucket
創建bucket時,bucket的名字一定要是沒有被別人和自己取過的
他人存在的bucketName,則會出現以下資訊
[ErrorCode]: AccessDenied
[RequestId]: xxxxxxx
[HostId]: image.oss-cn-shanghai.aliyuncs.com
[ResponseError]:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message>
<RequestId>xxxxxxxxx</RequestId>
<HostId>image.oss-cn-shanghai.aliyuncs.com</HostId>
<Bucket>image</Bucket>
<Endpoint>oss-cn-hangzhou.aliyuncs.com</Endpoint>
</Error>
自己存在的bucketNam
[ErrorCode]: BucketAlreadyExists
[RequestId]: xxxxxxxxx
[HostId]: data-lujy.oss-cn-shanghai.aliyuncs.com
[ResponseError]:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>BucketAlreadyExists</Code>
<Message>The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.</Message>
<RequestId>xxxxxxxxxxx</RequestId>
<HostId>data-lujy.oss-cn-shanghai.aliyuncs.com</HostId>
<BucketName>data-lujy</BucketName>
</Error>
tip:這兩者的區別在于,第一個相當于去訪問一個bucket但是密碼和賬戶錯了,從而導致了拒絕訪問,第二個則是賬戶和密碼正確,成功訪問了,當時在創建的時候,出現了相同bucket,
/**
* 創建一個bucket
*
* @param oss OSSClient
* @param bucketName 桶的名稱
*/
public Bucket createBucket(OSS oss, String bucketName) {
final boolean b = oss.doesBucketExist(bucketName);
if (b) {
log.warn("該名稱已存在:{}", bucketName);
return null;
} else {
return oss.createBucket(bucketName);
}
}
1.2.4 上傳檔案
oss的上傳檔案方式很多,這里只是采用了比較簡單的一種
/**
* 簡單上傳檔案
* @param oss OssClient
* @param objectName 保存為指定的路徑名稱 需全路徑如 image/day01/xxx.txt
* @param inputStream 檔案流
* @return
*/
public Boolean uploadFile(OSS oss, String objectName, InputStream inputStream) {
try {
final PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
//上傳檔案
final PutObjectResult putObjectResult = oss.putObject(putObjectRequest);
return putObjectResult != null;
} catch (OSSException | ClientException e) {
e.printStackTrace();
return false;
}
}
1.2.5 下載檔案
流下載
/**
* 流下載
*
* @param oss
* @param objectName
* @return
*/
public void downloadFileStream(OSS oss, String objectName) {
final OSSObject object = oss.getObject(bucketName, objectName);
final String key = object.getKey();
System.out.println(key);
try (
InputStream is = object.getObjectContent();
OutputStream os = new FileOutputStream(new File("src/main/resources/static/" + objectName));
) {
//創建快取區
byte[] bytes = new byte[2048];
int length;
while ((length = is.read(bytes)) != -1) {
os.write(bytes, 0, length);
}
log.info("全部寫入快取區");
os.flush();
} catch (Exception e) {
e.printStackTrace();
log.error("流讀取出現錯誤:{}", e.getMessage());
}
}
本地下載
/**
* 下載到本地
*
* @param oss OssClient
* @param objectName oss 中的檔案地址
* @param localFile 本地檔案地址 如果存在 則會直接覆寫不會新建
*/
public Boolean downloadFileLocal(OSS oss, String objectName, File localFile) {
final ObjectMetadata omd;
try {
final GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectName);
omd = oss.getObject(getObjectRequest, localFile);
if (omd == null) {
log.info("本地檔案下載失敗,原因:ObjectMetadata 為空");
return false;
} else {
log.info("下載成功");
return true;
}
} catch (OSSException | ClientException e) {
e.printStackTrace();
log.info("下載出現例外:{}", e.getMessage());
return false;
}
}
// TODO: 2021/2/9 范圍下載(未完成) // TODO: 2021/2/9 斷電續傳下載(未完成) // TODO: 2021/2/9 限定條件下載(未完成)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/258710.html
標籤:java
上一篇:什么是依賴注入?
