私はs3にイメージを保存するためにnode.jsを使用するイメージサーバーを作成しようとしています。画像をアップロードするとうまく動作し、s3ブラウザクライアントを使用して正しくダウンロードして表示できます(特に私はdragondiskを使用していますが、他のものとのダウンロードにも成功しました)。しかし、ノードでダウンロードして試してみるとそれをディスクに書き込むには、ファイルを開くことができません(ファイルが破損しているか、またはプレビューが認識できないファイル形式を使用している可能性があります)。私はnodeとfsにamazon sdkを使ってファイルを書いています。オプションのエンコーディングをfs.writeFileに渡すことができますが、それらをすべて試しても機能しません。また、getObjectのputObjectとResponseContentTypeのContentTypeと、ContentEncodingとResponseContentEncoding(およびこれらのすべてをさまざまな組み合わせで設定)を試みました。同じ結果。ここではいくつかのコードがあります:ちなみにs3に保存された画像をnode.jsを使って保存しますか?
var AWS = require('aws-sdk')
, gm = require('../lib/gm')
, uuid = require('node-uui')
, fs = require('fs');
AWS.config.loadFromPath('./amazonConfig.json');
var s3 = new AWS.S3();
var bucket = 'myBucketName'; // There's other logic here to set the bucket name.
exports.upload = function(req, res) {
var id = uuid.v4();
gm.format("/path/to/some/image.jpg", function(format){
var key = req.params.dir + "/" + id + "/default." + format;
fs.readFile('/path/to/some/image.jpg', function(err, data){
if (err) { console.warn(err); }
else {
s3.client.putObject({
Bucket: bucket,
Key: key,
Body: data,
ContentType: 'image/jpeg'
// I've also tried adding ContentEncoding (in various formats) here.
}).done(function(response){
res.status(200).end(JSON.stringify({ok:1, id: id}));
}).fail(function(response){
res.status(response.httpResponse.statusCode).end(JSON.stringify(({err: response})));
});
}
});
});
};
exports.get = function(req, res) {
var key = req.params.dir + "/" + req.params.id + "/default.JPEG";
s3.client.getObject({
Bucket: bucket,
Key: key,
ResponseContentType: 'image/jpeg'
// Tried ResponseContentEncoding here in base64, binary, and utf8
}).done(function(response){
res.status(200).end(JSON.stringify({ok:1, response: response}));
var filename = '/path/to/new/image/default.JPEG';
fs.writeFile(filename, response.data.Body, function(err){
if (err) console.warn(err);
// This DOES write the file, just not as an image that can be opened.
// I've tried pretty much every encoding as the optional third parameter
// and I've matched the encodings to the ResponseContentEncoding and
// ContentEncoding above (in case it needs to be the same)
});
}).fail(function(response){
res.status(response.httpResponse.statusCode).end(JSON.stringify({err: response}));
});
};
req.paramsはどこから来ることがありますので、私は、ルーティングのための急行を使用しています。
私はちょうどことを発見fs.readFile()とfs.writeFile()へのエンコーディングとして 'base64'を渡すと、その逆が真です。私は自分のサービスを使ってイメージをダウンロードして見ることができますが、s3ブラウザクライアントを使ってイメージをダウンロードするとそれを見ることはできません。両方を行う方法はありますか? – tandrewnichols