更新:将来の参照のために、Amazonは、質問の時点であったドキュメントを更新しました。以下の@Loren Segalのコメントによると:-
このパラメーターを適切に文書化するために、最新のプレビューリリースのドキュメントを修正しました。混乱についてすみません!
Node.Js用AWS SDK の開発者プレビューを試しており、putObject
を使用して圧縮されたtarballをS3にアップロードします。
ドキュメント によると、Body
パラメータは...
本文-(Base64エンコードデータ)
...したがって、私は次のコードを試しています...
var AWS = require('aws-sdk'),
fs = require('fs');
// For dev purposes only
AWS.config.update({ accessKeyId: 'key', secretAccessKey: 'secret' });
// Read in the file, convert it to base64, store to S3
fs.readFile('myarchive.tgz', function (err, data) {
if (err) { throw err; }
var base64data = new Buffer(data, 'binary').toString('base64');
var s3 = new AWS.S3();
s3.client.putObject({
Bucket: 'mybucketname',
Key: 'myarchive.tgz',
Body: base64data
}).done(function (resp) {
console.log('Successfully uploaded package.');
});
});
その後、S3でファイルを表示できますが、ダウンロードして解凍しようとすると、ファイルが破損しているというエラーが表示されます。したがって、「base64でエンコードされたデータ」の方法はオフになっているようです。
誰かがputObject
を使用してバイナリファイルをアップロードするのを手伝ってくれますか?
バッファをbase64文字列に変換する必要はありません。 bodyをデータに設定するだけで機能します。
ストリームを使用してファイルを送信する方法を次に示します。これは、大きなファイルに必要な場合があり、一般にメモリオーバーヘッドを削減します。
var AWS = require('aws-sdk'),
fs = require('fs');
// For dev purposes only
AWS.config.update({ accessKeyId: 'key', secretAccessKey: 'secret' });
// Read in the file, convert it to base64, store to S3
var fileStream = fs.createReadStream('myarchive.tgz');
fileStream.on('error', function (err) {
if (err) { throw err; }
});
fileStream.on('open', function () {
var s3 = new AWS.S3();
s3.putObject({
Bucket: 'mybucketname',
Key: 'myarchive.tgz',
Body: fileStream
}, function (err) {
if (err) { throw err; }
});
});
この方法でバイナリファイルをアップロードできました。
var fileStream = fs.createReadStream("F:/directory/fileName.ext");
var putParams = {
Bucket: s3bucket,
Key: s3key,
Body: fileStream
};
s3.putObject(putParams, function(putErr, putData){
if(putErr){
console.error(putErr);
} else {
console.log(putData);
}
});