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

migrate multipart upload with presigned urls from aws javascript sdk v2 to v3

我成功地获得了允许使用预签名 url 支持分段上传的代码。 我成功地将代码转换为带有预签名 urls 的单次上传,但我无法找到如何将预签名 urls 的创建从 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 是错误的,但是我找不到关于这个问题的任何信息。

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

无效代码有 2 个问题:

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