将aws-sdk升级到第三版 - 流式上传S3

4
我正尝试将一个程序升级到aws-sdk版本3,但是我遇到了以下错误:
"NotImplemented: A header you provided implies functionality that is not implemented"
函数get_s3_stream需要向主程序返回流。
在SDK版本2中,它可以正常工作。
var AWS = require("aws-sdk");
var s3 = new AWS.S3({apiVersion: '2006-03-01'});
const stream = require('stream');

function get_s3_stream() {
  var pass = new stream.PassThrough();
  var params = {Bucket: "bucketname", Key: "testfile1.txt", Body: pass};
  s3.upload(params, function(err, data) {
    console.log(err, data);
  });
  return pass;
}

const inputStream = stream.Readable.from(["input string1"])
const outStream = get_s3_stream()
inputStream.pipe(outStream);

SDK版本3无法正常工作:

const { S3Client, PutObjectCommand } = require("@aws-sdk/client-s3");
const s3Client = new S3Client({ region: "us-east-1" });
const stream = require('stream')

function get_s3_stream() {
    const pass = new stream.PassThrough();  
    var params = {Bucket: "bucketname", Key: "testfile2.txt", Body: pass};
    s3Client.send(new PutObjectCommand(params, function(err, data) {
        console.log(err, data);
      }));
    return pass;
};

const inputStream = stream.Readable.from(["input string2"])
const outStream = get_s3_stream()
inputStream.pipe(outStream);

如何使用新版本将流发送到S3?

1个回答

4

显然这是一个已知的问题:https://github.com/aws/aws-sdk-js-v3/issues/1920

使用传递流(passthrough streams)的一种解决方法是使用来自@aws-sdk/lib-storageUpload

const { S3Client } = require("@aws-sdk/client-s3");
const { Upload } = require('@aws-sdk/lib-storage');
const stream = require('stream')

const s3Client = new S3Client({ region: "us-east-1" });

function get_s3_stream() {
    const pass = new stream.PassThrough();
    const upload = new Upload({
        client: s3Client,
        params: {
            Bucket: 'bucketname',
            Key: 'testfile2.txt',
            Body: pass,
            ContentType: 'text/plain',
        },
    });

    upload.done().then((res, error) => {
        console.log(res);
    });

    return pass;
}

完美,它运行正常!谢谢!非常出色的Google技能。 - Jon Wilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接