既定では、既存のオブジェクトと同じ名前のオブジェクトをアップロードすると、既存のオブジェクトはアップロードされたオブジェクトによって上書きされます。 このトピックでは、x-oss-forbid-overwriteリクエストヘッダーを設定して、オブジェクトをコピーするとき、または単純なアップロードまたはマルチパートアップロードを実行するときに、既存のオブジェクトが同じ名前のオブジェクトによって上書きされないようにする方法について説明します。
使用状況ノート
WebpackやBrowserifyなどのパッケージングツールを使用する場合は、npm install ali-OSSコマンドを実行して、oss SDK for Browser.jsをインストールします。
ブラウザからOSSバケットにアクセスしたいが、バケットにCORSルールが設定されていない場合、ブラウザはリクエストを拒否します。 したがって、ブラウザからバケットにアクセスする場合は、バケットのCORSルールを設定する必要があります。 詳細については、「インストール」をご参照ください。
ほとんどの場合、ブラウザではOSS SDK for Browser.jsが使用されます。 AccessKeyペアが公開されないようにするには、Security Token Service (STS) から取得した一時的なアクセス資格情報を使用してOSSにアクセスすることを推奨します。
一時的なアクセス資格情報は、AccessKeyペアとセキュリティトークンで構成されます。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。 一時的なアクセス資格情報を取得する方法の詳細については、「一時的なアクセス権限付与にSTSを使用する」をご参照ください。
単純なアップロードタスクでの上書きの防止
次のサンプルコードは、単純アップロードで同じ名前のオブジェクトによってオブジェクトが上書きされないようにする方法の例を示しています。
<!DOCTYPE html>
<html lang="en">
<ヘッド>
<meta charset="UTF-8" />
<title> ドキュメント </title>
</head>
<body>
<button id="upload"> オブジェクトのアップロード </button>
<!-- SDKファイルのインポート->
<script type="text/javascript" src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js"></script>
<script type="text/javascript">
const client = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。
リージョン: 'yourRegion' 、
// STSから取得した一時的なAccessKeyペアを指定します。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。
accessKeyId: 'yourAccessKeyId' 、
accessKeySecret: 'yourAccessKeySecret' 、
// STSから取得したセキュリティトークンを指定します。
stsToken: 'yourSecurityToken' 、
// バケットの名前を指定します。 例: examplebucket.
bucket: "examplebucket" 、
});
const upload = document.getElementById('upload')
// アップロードするローカルファイルを指定します。
const fileContent=配列 (1024*1024*10).fill('a').join('')
const fileName = 'example.txt'
const file = new Blob([fileContent])
// 同じ名前の既存のオブジェクトを上書きするかどうかを指定します。 この例では、このパラメーターはtrueに設定されています。これは、同じ名前のオブジェクトを上書きしないことを指定します。 同じ名前のオブジェクトがバケットに存在する場合、OSSはエラーを返します。
const headers = {
'x-oss-forbid-overwrite': true
}
upload.addEventListener('click', () => {
// ローカルファイルをアップロードします。
client.put(fileName, file, { headers }).then(r => console.log(r))
})
</script>
</body>
</html>
オブジェクトコピータスクでの上書きの防止
次のサンプルコードは、既存のオブジェクトが同じ名前の新しくコピーされたオブジェクトによって上書きされないようにする方法の例を示しています。
<!DOCTYPE html>
<html lang="en">
<ヘッド>
<meta charset="UTF-8" />
<title> ドキュメント </title>
</head>
<body>
<button id="upload"> オブジェクトのアップロード </button>
<!-- SDKファイルのインポート->
<script type="text/javascript" src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js"></script>
<script type="text/javascript">
const client = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。
リージョン: 'yourRegion' 、
// STSから取得した一時的なAccessKeyペアを指定します。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。
accessKeyId: 'yourAccessKeyId' 、
accessKeySecret: 'yourAccessKeySecret' 、
// STSから取得したセキュリティトークンを指定します。
stsToken: 'yourSecurityToken' 、
// バケットの名前を指定します。 例: examplebucket.
bucket: "examplebucket" 、
});
const upload = document.getElementById('upload')
// コピーするオブジェクトを指定します。
const fileContent=配列 (1024*1024*5).fill('a').join('')
const fileName = 'example.txt'
const file = new Blob([fileContent])
// 同じ名前の既存のオブジェクトを上書きするかどうかを指定します。 この例では、このパラメーターはtrueに設定されています。これは、同じ名前のオブジェクトを上書きしないことを指定します。 同じ名前のオブジェクトがバケットに存在する場合、OSSはエラーを返します。
const headers = {
'x-oss-forbid-overwrite': true
}
upload.addEventListener('click', () => {
// オブジェクトをコピーします。
// コピーしたオブジェクトの名前をdest.txtに変更します。
client.copy("dest.txt",fileName,{headers}).then(r=>console.log(r))
})
</script>
</body>
</html>
マルチパートアップロードタスクでの上書きの防止
次のコードでは、マルチパートアップロードで同じ名前の新しくアップロードされたオブジェクトによってオブジェクトが上書きされないようにする方法の例を示します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title> ドキュメント </title>
</head>
<body>
<button id="upload"> オブジェクトのアップロード </button>
<!-- SDKファイルのインポート->
<スクリプト
type="text/javascript"
src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js"
></script>
<script type="text/javascript">
const client = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。
リージョン: 'yourRegion' 、
// STSから取得した一時的なAccessKeyペアを指定します。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。
accessKeyId: 'yourAccessKeyId' 、
accessKeySecret: 'yourAccessKeySecret' 、
// STSから取得したセキュリティトークンを指定します。
stsToken: 'yourSecurityToken' 、
// バケットの名前を指定します。 例: examplebucket.
bucket: "examplebucket" 、
});
const upload = document.getElementById("upload");
// アップロードするオブジェクトを指定します。
const fileContent=配列 (1024*1024*5)
. fill("a")
. join("");
const fileName = "src.txt";
const file = new Blob([fileContent]);
// 同じ名前の既存のオブジェクトを上書きするかどうかを指定します。 この例では、このパラメーターはtrueに設定されています。これは、同じ名前のオブジェクトを上書きしないことを指定します。 同じ名前のオブジェクトがバケットに存在する場合、OSSはエラーを返します。
const headers = {
"x-oss-forbid-overwrite": true、
};
upload.addEventListener("click", () => {
// マルチパートアップロードタスクを開始します。
client
. multipartUpload("dest.txt" 、ファイル、{headers })
. then((r) => console.log(r));
});
</script>
</body>
</html>
参考資料
- シンプルアップロードを実行するために呼び出すことができるAPI操作の詳細については、「PutObject」をご参照ください。
- オブジェクトをコピーするために呼び出すことができるAPI操作の詳細については、「CopyObject」をご参照ください。
OSS SDK for Browser.jsがマルチパートアップロードを実行するために使用する
multipartUpload
メソッドには、次の3つのAPI操作が含まれます。マルチパートアップロードタスクを開始するために呼び出すことができるAPI操作。 詳細については、「InitiateMultipartUpload」をご参照ください。
部分的にデータをアップロードするために呼び出すことができるAPI操作。 詳細については、「UploadPart」をご参照ください。
マルチパートアップロードタスクを完了するために呼び出すことができるAPI操作。 詳細については、「CompleteMultipartUpload」をご参照ください。