天天看點

亞馬遜雲COS元件使用實踐總結

【1】建立目錄對象

建立檔案–帶有檔案目錄 如 ​

​test1/test3/hello.txt​

​。如果目标對象已經存在,則會進行覆寫。

AmazonS3 singleAmazonS3 = this.getSingleAmazonS3();
// 建立檔案--帶有檔案目錄  如 test1/test3/hello.txt
Bucket bucket = cosFileSystem.getBucket(singleAmazonS3);
singleAmazonS3.putObject(bucket.getName(),"test1/test3/hello.txt",new File("./hello.txt"));      

通過控制台登入檢視,會看到如下結構:

亞馬遜雲COS元件使用實踐總結

注意,這裡目标對象的key建議不要以​​

​/​

​​開頭,否則bucket内會有一個目錄​

​/​

​​,這個不符合COS的規範。比如​

​/test1/test3/hello.txt​

​​,其最終效果不是我們想象的​

​test1 -- test3 目錄下有個hello.txt​

​​,而是​

​/ -- test1---test3 下有個hello.txt​

​。

對象名稱如果帶有目錄,那麼應該是​

​a/b/hello.txt​

​​格式,​

​a\b\hello.txt​

​格式是錯誤的,不支援的。

【2】擷取檔案對象

① 通過key直接擷取檔案對象本身

假設檔案對象名稱為​

​test1/test4/hello.txt​

​,那麼如下所示可以拿到檔案對象然後包裝為流。之後就是最基本的IO操作了,可以實作檔案下載下傳。

S3Object amazonS3Object = singleAmazonS3.getObject(bucket.getName(), "test1/test4/hello.txt");
S3ObjectInputStream objectInputStream = amazonS3Object.getObjectContent();
BufferedInputStream bufferedInputStream = new BufferedInputStream(objectInputStream);      

② 擷取檔案下載下傳連結

Bucket bucket = getBucket(singleAmazonS3);
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket.getName(), "test1/test4/hello.txt");
URL url = singleAmazonS3.generatePresignedUrl(request);
logger.debug("{}生成的檔案下載下傳連結為:{}",saveName,url);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setConnectTimeout(15000);
connection.connect();
InputStream urlInputStream = connection.getInputStream();      

③ 判斷檔案對象是否存

AmazonS3 singleAmazonS3 = this.getSingleAmazonS3();
Bucket bucket = singleAmazonS3.listBuckets().get(0);
// true  or  false
boolean exist = singleAmazonS3.doesObjectExist(bucket.getName(), "111.txt");      

【3】異常解決

// 原始上傳
singleAmazonS3.putObject(bucket.getName(), saveName,inputStream , new ObjectMetadata());

//修改為如下 -也就是說給objectMetadata設定長度
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(inputStream.available());
singleAmazonS3.putObject(bucket.getName(), saveName,inputStream , objectMetadata);      

繼續閱讀