【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"));
通過控制台登入檢視,會看到如下結構:

注意,這裡目标對象的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);