本文收錄于【#云計(jì)算入門與實(shí)踐 - AWS】專欄中,收錄 AWS 入門與實(shí)踐相關(guān)博文。
本文同步于個(gè)人公眾號(hào):【云計(jì)算洞察】
更多關(guān)于云計(jì)算技術(shù)內(nèi)容敬請關(guān)注:CSDN【#云計(jì)算入門與實(shí)踐 - AWS】專欄。
本系列已更新博文:
- [ 云計(jì)算 | AWS 實(shí)踐 ] Java 應(yīng)用中使用 Amazon S3 進(jìn)行存儲(chǔ)桶和對象操作完全指南
- [ 云計(jì)算 | AWS 實(shí)踐 ] Java 如何重命名 Amazon S3 中的文件和文件夾
- [ 云計(jì)算 | AWS 實(shí)踐 ] 使用 Java 列出存儲(chǔ)桶中的所有 AWS S3 對象
- [ 云計(jì)算 | AWS 實(shí)踐 ] 使用 Java 更新現(xiàn)有 Amazon S3 對象
- [ 云計(jì)算 | AWS 實(shí)踐 ] 基于 Amazon S3 協(xié)議搭建個(gè)人云存儲(chǔ)服務(wù)
- [ 云計(jì)算 | AWS 實(shí)踐 ] 使用 Java 檢查指定的密鑰是否存在于給定的 Amazon S3 存儲(chǔ)桶中
一、前言
Amazon Simple Storage Service(Amazon S3)是一種廣泛使用的存儲(chǔ)服務(wù),提供了可擴(kuò)展、安全和持久的對象存儲(chǔ)功能。在某些情況下,我們需要更新已存在于 Amazon S3 中的對象。在 S3 中,對象是不可變的,這意味著我們不能直接修改對象的內(nèi)容。但是,我們可以通過覆蓋對象內(nèi)容的方式來有效地“更新”它。
本篇文章將介紹如何使用 AWS Java SDK,將位于同一 AWS S3 路徑下的現(xiàn)有文件內(nèi)容替換為新內(nèi)容。
二、前期準(zhǔn)備
2.1 導(dǎo)入Maven 依賴
首先,我們需要確保AWS SDK Maven依賴包已合并到項(xiàng)目中,讓我們創(chuàng)建一個(gè)新的 Java 項(xiàng)目并將以下 Maven 依賴項(xiàng)添加到 pom.xml 文件中:
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.21.0</version>
</dependency>
2.1 準(zhǔn)備幾個(gè)必要信息
要使用AWS SDK,我們需要以下幾個(gè)要素:
AWS 帳戶:首先,需要一個(gè)Amazon Web Services(AWS)帳戶。如果尚未擁有,可直接在 AWS 控制臺(tái)創(chuàng)建。
AWS 安全憑證:這些安全憑證是我們訪問 AWS API 操作所需的訪問密鑰??赏ㄟ^兩種方式獲?。菏褂?AWS 根帳戶憑證中的“安全憑證”頁面,或在 IAM 控制臺(tái)中獲取 IAM 用戶憑證。
選擇AWS區(qū)域(Region):同時(shí)需要選擇一個(gè) AWS 區(qū)域來存儲(chǔ) Amazon S3 數(shù)據(jù)。需注意,S3 存儲(chǔ)價(jià)格因區(qū)域不同而異。詳細(xì)信息可參考官方文檔(點(diǎn)擊這里)。
三、更新 S3 對象的步驟
3.1.初始化 S3 客戶端
首先,我們需要?jiǎng)?chuàng)建客戶端連接來訪問 Amazon S3 Web 服務(wù)。為此,我們將使用 AmazonS3 接口:
無論是你怎么寫,都要先初始化 S3 客戶端對象,之后在進(jìn)行操作即可,記住這個(gè)步驟。
AWSCredentials credentials = new BasicAWSCredentials(
"AWS AccessKey",
"AWS secretKey"
);
然后我們將配置客戶端:
AmazonS3 s3client = AmazonS3ClientBuilder.standard()
.withRegion(Regions.fromName("us-east-1"))
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.build();
3.2 將新對象上傳到 S3
現(xiàn)在我們可以使用 AWS Java SDK 在方法 putObject() 中將文件上傳到 S3 存儲(chǔ)桶:
PutObjectRequest request = PutObjectRequest.builder()
.bucket(bucketName)
.key(key)
.build();
return s3Client.putObject(request, Path.of(file.toURI()));
下面是調(diào)用上述代碼的代碼片段:
s3Service.putObject(
AWS_BUCKET,
"Document/helloWord.txt",
new File("/Users/bluetata/Document/helloWord.txt")
);
3.3 上傳(覆蓋)對象
由于 S3 中的對象是不可變的,因此“更新”對象涉及用新內(nèi)容覆蓋該對象。因此,為了更新,我們需要使用與添加文檔相同的參數(shù)集來調(diào)用相同的putObject()
方法:
public PutObjectResponse updateObject(String bucketName, String key, java.io.File file) {
return this.putObject(bucketName, key, file);
}
此代碼將用提供的新內(nèi)容替換現(xiàn)有對象。如果具有給定鍵的對象不存在,S3 將創(chuàng)建一個(gè)新對象。
3.4 驗(yàn)證更新
我們可能想要驗(yàn)證對象是否已成功更新。實(shí)現(xiàn)此目的的一種方法是檢索對象的元數(shù)據(jù)并檢查lastModified
日期,或者計(jì)算對象的校驗(yàn)和并將其與預(yù)期值進(jìn)行比較。
HeadObjectRequest req = HeadObjectRequest.builder()
.bucket(bucketName)
.key(key)
.build();
HeadObjectResponse response = s3Client.headObject(request);
System.out.println("Last Modified: " + response.lastModified());
四、注意事項(xiàng)(重要)
需要牢記的是,在 S3 中,覆蓋對象實(shí)際上是一次PUT
操作,這可能會(huì)導(dǎo)致成本增加。在進(jìn)行 S3 操作時(shí),請時(shí)刻注意成本影響。
如果存儲(chǔ)桶啟用了版本控制,覆蓋對象不會(huì)刪除舊版本,而是會(huì)創(chuàng)建該對象的新版本。因此,我們會(huì)擁有對象的多個(gè)版本,每個(gè)版本都有獨(dú)特的 ID。在需要時(shí),我們可以檢索任何以前的版本。
最后,如果元數(shù)據(jù)與該對象關(guān)聯(lián),請注意覆蓋該對象將使用 PUT 操作期間提供的新元數(shù)據(jù)替換舊元數(shù)據(jù)。如果我們想保留舊的元數(shù)據(jù),我們必須在請求中顯式設(shè)置它。
五、文末總結(jié)
雖然我們不能直接修改 S3 對象的內(nèi)容,但是利用適用于 Java 的 AWS 開發(fā)工具包,可以輕松地用新內(nèi)容覆蓋對象。務(wù)必牢記的是:比如避免硬編碼憑據(jù)以及了解操作可能帶來的成本影響。通過這些步驟,我們能夠自信地使用 Java 對 S3 對象進(jìn)行管理和更新。文章來源:http://www.zghlxwxcb.cn/news/detail-751926.html
文末已經(jīng)更新了 4 篇關(guān)于在 AWS 中各種操作 S3 的博文,希望對你有所幫助,更多博文敬請關(guān)注本博客。文章來源地址http://www.zghlxwxcb.cn/news/detail-751926.html
[ 本文作者 ] bluetata
[ 原文鏈接 ] https://bluetata.blog.csdn.net/article/details/134498219
[ 最后更新 ] 11/20/2023 2:08
[ 版權(quán)聲明 ] 如果您在非 CSDN 網(wǎng)站內(nèi)看到這一行,
說明網(wǎng)絡(luò)爬蟲可能在本人還沒有完整發(fā)布的時(shí)候就抓走了我的文章,
可能導(dǎo)致內(nèi)容不完整,請去上述的原文鏈接查看原文。
到了這里,關(guān)于[ 云計(jì)算 | AWS 實(shí)踐 ] 使用 Java 更新現(xiàn)有 Amazon S3 對象的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!