簡體   English   中英

將帶有預簽名 url 的分段上傳從 aws javascript sdk v2 遷移到 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM