Отправка двоичных данных в Amazon S3 с помощью Node.js
пытаюсь взять изображение и загрузить его в корзину Amazon S3 с помощью Node.js. В конце концов, я хочу получить изображение до S3, а затем получить доступ к URL-адресу S3 и просмотреть изображение в браузере. Я'используя запрос 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()
}
});
});
};
Мой файл имеет размер 0 байт, как показано на Amazon S3. Как мне сделать так, чтобы я мог использовать 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()
}
});
});
};
Итак, чтобы выгрузить файл в конечную точку API (используя Node.js и Express) и получить от API этот файл в Amazon S3, сначала нужно выполнить запрос POST с помощью команды "файлы» поле заселено. Файл заканчивается на стороне API, где он находится, вероятно, в некотором каталоге tmp. Amazon»s3 метод putObject требует Stream, поэтому вам нужно создать поток чтения, передавфс Модуль путь, где существует загруженный файл.
Я неНе знаю, если это правильный способ загрузки данных, но это работает. Кто-нибудь знает, есть ли способ POST двоичных данных внутри тела запроса и API отправить это на S3? Я неЯ не знаю, в чем разница между загрузкой нескольких частей и стандартным POST в body.