gpt4 book ai didi

javascript - 将带有预签名 URL 的分段上传从 aws javascript sdk v2 迁移到 v3

转载 作者:行者123 更新时间:2023-12-03 08:06:46 25 4
gpt4 key购买 nike

我成功地获得了允许使用预签名网址支持分段上传的代码。我成功地转换了带有预签名 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。我找不到任何好的文档。我确定我使用的是 false getSignedUrl,但我找不到有关此问题的任何信息。

谢谢你帮我解决这个问题。

最佳答案

不工作的代码有两个问题:

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;
}


关于javascript - 将带有预签名 URL 的分段上传从 aws javascript sdk v2 迁移到 v3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72107126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com