![](/img/trans.png)
[英]How to upload an object using presigned URL along with tags in s3 aws-sdk-ruby v3
[英]migrate multipart upload with presigned urls from aws javascript sdk v2 to v3
我成功地擁有了允許使用預簽名 url 支持分段上傳的代碼。 我成功地將代碼轉換為帶有預簽名 url 的單次上傳,但我無法找到如何將為分段上傳創建的預簽名 url 從 sdk v2 轉換為 sdk v3。
V2 - 工作:
這是 sdk v2 的工作代碼
import * as AWS from 'aws-sdk'
const s3 = new AWS.S3()
async function getMultipartUploadId(bucket: string, key: string): Promise<any> {
const params = {
Bucket: ACCESS_POINT.concat(bucket),
Key: key
};
return await new Promise((resolve, reject) => {
s3.createMultipartUpload(params, (err, id) => {
err ? reject(err) : resolve(id);
});
});
}
async function getPartUploadUrl(
bucket: string,
key: string,
uploadId: string,
partNumber: number,
md5: string): Promise<string> {
const params = {
Bucket: bucket,
Key: key,
UploadId: uploadId,
PartNumber: partNumber,
Expires: 60 * 5,
ContentMD5: md5
};
const url = await new Promise((resolve, reject) => {
s3.getSignedUrl('uploadPart', params, (err, url) => {
err ? reject(err) : resolve(url);
});
});
return url as string;
}
async function completeMultiUpload ....
V3 - 不工作:
import {
S3Client,
PutObjectCommand,
CreateMultipartUploadCommand,
CompleteMultipartUploadCommand
} from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner'
...
this.client = new S3Client(
{
...
}
)
...
/* this method produces successfully a upload id */
async getMultipartUploadId(bucket: string, key: string): Promise<string> {
const input = {
Bucket: this.accessPoint.concat(bucket),
Key: key
};
const cmd = new CreateMultipartUploadCommand(input);
const response = this.client.send(cmd);
return response.UploadId;
}
/**
* Get an upload url for a part of a multi part upload.
*
* @param bucket The bucket name.
* @param key The object key.
* @param uploadId The multi part upload id.
* @param partNumber The part number.
* @param md5 The MD5 hash of the part.
* @returns An upload url for a part of a multi part upload.
*/
async getPartUploadUrl(
bucket: string,
key: string,
uploadId: string,
partNumber: number,
md5: string): Promise<string> {
const params = {
Bucket: this.accessPoint.concat(bucket),
Key: key,
UploadId: uploadId,
PartNumber: partNumber,
ContentMD5: md5
};
const cmd = new PutObjectCommand(params);
const signedUrl = await getSignedUrl(this.client, cmd, {
expiresIn: 60 * 15,
});
return signedUrl as string;
}
async completeMultiUpload ....
問題是預簽名的 url 不是用於多部分而是一個完整的文件。
我的問題是如何為分段上傳生成預簽名的 url。 我找不到任何好的文檔。 我確定我使用的 getSignedUrl 是錯誤的,但我找不到有關此問題的任何信息。
謝謝你幫我解決這個問題。
無效代碼有兩個問題:
1 - 缺少 await 語句
/* this method produces successfully a upload id */
async getMultipartUploadId(bucket: string, key: string): Promise<string> {
const input = {
Bucket: this.accessPoint.concat(bucket),
Key: key
};
const cmd = new CreateMultipartUploadCommand(input);
const response = await this.client.send(cmd);
return response.UploadId;
}
2 - 使用UploadPartCommand
而不是PubObjectCommand
/**
* Get an upload url for a part of a multi part upload.
*
* @param bucket The bucket name.
* @param key The object key.
* @param uploadId The multi part upload id.
* @param partNumber The part number.
* @param md5 The MD5 hash of the part.
* @returns An upload url for a part of a multi part upload.
*/
async getPartUploadUrl(
bucket: string,
key: string,
uploadId: string,
partNumber: number,
md5: string): Promise<string> {
const params = {
Bucket: this.accessPoint.concat(bucket),
Key: key,
UploadId: uploadId,
PartNumber: partNumber,
ContentMD5: md5
};
const cmd = new UploadPartCommand(params);
const signedUrl = await getSignedUrl(this.client, cmd, {
expiresIn: 60 * 15,
});
return signedUrl as string;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.