13

画像を取得し、Node.js を使用して Amazon S3 バケットにアップロードしようとしています。最終的には、画像を S3 にプッシュしてから、その S3 URL にアクセスしてブラウザーで画像を表示できるようにしたいと考えています。Curl クエリを使用して、画像を本文として HTTP POST リクエストを実行しています。

curl -kvX POST --data-binary "@test.jpg" 'http://localhost:3031/upload/image'

次に、Node.js 側で次のようにします。

exports.pushImage = function(req, res) {
    var image = new Buffer(req.body);
    var s3bucket = new AWS.S3();
    s3bucket.createBucket(function() {
        var params = {Bucket: 'My/bucket', Key: 'test.jpg', Body: image};
        // Put the object into the bucket.
        s3bucket.putObject(params, function(err) {
            if (err) {
                res.writeHead(403, {'Content-Type':'text/plain'});
                res.write("Error uploading data");
                res.end()
            } else {
                res.writeHead(200, {'Content-Type':'text/plain'});
                res.write("Success");
                res.end()
            }
        });
    });
};

Amazon S3 に示されているように、私のファイルは 0 バイトです。Node.js を使用してバイナリ ファイルを S3 にプッシュできるようにするにはどうすればよいですか? バイナリ データとバッファの何が間違っていますか?

アップデート:

私は自分が何をする必要があるかを知りました。最初に変更する必要があるのは、curl クエリです。これは作業中のものです:

curl -kvX POST -F foobar=@my_image_name.jpg 'http://localhost:3031/upload/image'

次に、ストリームに変換する行を追加しました。これは作業コードです:

exports.pushImage = function(req, res) {
    var image = new Buffer(req.body);
    var s3bucket = new AWS.S3();
    s3bucket.createBucket(function() {
        var bodyStream = fs.createReadStream(req.files.foobar.path);
        var params = {Bucket: 'My/bucket', Key: 'test.jpg', Body: bodyStream};
        // Put the object into the bucket.
        s3bucket.putObject(params, function(err) {
            if (err) {
                res.writeHead(403, {'Content-Type':'text/plain'});
                res.write("Error uploading data");
                res.end()
            } else {
                res.writeHead(200, {'Content-Type':'text/plain'});
                res.write("Success");
                res.end()
            }
        });
    });
};

そのため、(Node.js と Express を使用して) API エンドポイントにファイルをアップロードし、API がそのファイルを Amazon S3 にプッシュするようにするには、まず「files」フィールドにデータを入力して POST リクエストを実行する必要があります。ファイルは API 側で終了し、おそらく tmp ディレクトリに存在します。Amazon の S3 putObject メソッドには Stream が必要なため、「fs」モジュールにアップロードされたファイルが存在するパスを指定して、読み取りストリームを作成する必要があります。

これがデータをアップロードする適切な方法かどうかはわかりませんが、機能します。リクエスト本文内でバイナリデータを POST し、API にそれを S3 に送信させる方法があるかどうかは誰にもわかりませんか? マルチパートアップロードと標準の POST to body の違いはよくわかりません。

4

1 に答える 1