10

リクエストを使用してファイルのコンテンツをダウンロードし、ノード用の aws-sdk を使用して s3 に直接ストリーミングするにはどうすればよいですか?

以下のコードObject #<Request> has no method 'read'は、リクエストが読み取り可能なストリームを返さないように見えるようにします...

var req = require('request');
var s3 = new AWS.S3({params: {Bucket: myBucket, Key: s3Key}});
var imageStream = req.get(url)
    .on('response', function (response) {
      if (200 == response.statusCode) {
        //imageStream should be read()able by now right?
        s3.upload({Body: imageStream, ACL: "public-read", CacheControl: 5184000}, function (err, data) {  //2 months
          console.log(err,data);
        });
      }
    });
});

aws -sdk docs Bodyによると、オブジェクトである必要がありReadableStreamます。

ここで何が間違っていますか?

これはs3-upload-streamモジュールを使用して実行できますが、依存関係を制限したいと考えています。

4

3 に答える 3

12

request@2.60.0 と aws-sdk@2.1.43 で @JoshSantangelo (S3 のゼロ バイト ファイル) と同じ問題があったので、Node 独自のhttpモジュールを使用して代替ソリューションを追加させてください (注意: 実生活からの単純化されたコードプロジェクトであり、個別にテストされていません):

var http = require('http');

function copyToS3(url, key, callback) {
    http.get(url, function onResponse(res) {
        if (res.statusCode >= 300) {
            return callback(new Error('error ' + res.statusCode + ' retrieving ' + url));
        }
        s3.upload({Key: key, Body: res}, callback);
    })
    .on('error', function onError(err) {
        return callback(err);
    });
}

私が知る限り、問題はrequest現在の Node ストリーム API を完全にサポートしていないことですが、それにaws-sdk依存しています。

参考文献:

于 2015-08-08T11:44:42.480 に答える
7

response応答ストリームを手動でリッスンしている場合は、オブジェクトを使用します。

var req = require('request');
var s3 = new AWS.S3({params: {Bucket: myBucket, Key: s3Key}});
var imageStream = req.get(url)
    .on('response', function (response) {
      if (200 == response.statusCode) {
        s3.upload({Body: response, ACL: "public-read", CacheControl: 5184000}, function (err, data) {  //2 months
          console.log(err,data);
        });
      }
    });
});
于 2015-06-18T18:16:29.333 に答える
1

非推奨になっているためRequest、Axios を利用したソリューションを次に示します。

const AWS = require('aws-sdk');
const axios = require('axios');

const downloadAndUpload = async function(url, fileName) {
  const res = await axios({ url, method: 'GET', responseType: 'stream' });
  const s3 = new AWS.S3(); //Assumes AWS credentials in env vars or AWS config file
  const params = {
    Bucket: IMAGE_BUCKET, 
    Key: fileName,
    Body: res.data,
    ContentType: res.headers['content-type'],
  };
  return s3.upload(params).promise();
}

現在のバージョンの AWS SDK は、AWS の資格情報が間違っているか、または欠落している場合でも例外をスローしないことに注意してください。Promise は決して解決されません。

于 2020-07-21T09:54:16.047 に答える