Отправка двоичных данных в 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 с заполненным полем «files». Файл заканчивается на стороне API, где он находится, вероятно, в некотором каталоге tmp. Для метода Amazon S3 putObject требуется Stream, поэтому вам нужно создать поток чтения, указав модулю 'fs' путь, по которому существует загруженный файл.

Я не знаю, является ли это правильным способом загрузки данных, но это работает. Кто-нибудь знает, есть ли способ POST двоичных данных внутри тела запроса и API отправить это на S3? Я не совсем понимаю, в чем разница между многочастной загрузкой и стандартным POST в body.

Ответы на вопрос(1)

Ваш ответ на вопрос