我成功地擁有了允許使用預簽名 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,但我找不到任何有關此問題的資訊。
謝謝你幫我解決這個問題。
uj5u.com熱心網友回復:
不作業的代碼有兩個問題:
1 - 缺少等待陳述句
/* 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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/470553.html
標籤:javascript 节点.js 亚马逊网络服务 亚马逊-s3 sdk
下一篇:氣流2中的S3KeySensor