画像を取得し、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 の違いはよくわかりません。