Przesyłanie danych binarnych do Amazon S3 za pomocą Node.js

Próbuję pobrać obraz i przesłać go do wiadra Amazon S3 przy użyciu Node.js. W końcu chcę móc przesłać obraz do S3, a następnie uzyskać dostęp do tego adresu URL S3 i zobaczyć obraz w przeglądarce. Korzystam z zapytania Curl, aby wykonać żądanie HTTP POST z obrazem jako treścią.

curl -kvX POST --data-binary "@test.jpg" 'http://localhost:3031/upload/image'

Następnie po stronie Node.js robię to:

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()
            }
        });
    });
};

Mój plik ma 0 bajtów, jak pokazano na Amazon S3. Jak mogę to zrobić, aby używać Node.js do wypychania pliku binarnego do S3? Co robię źle z danymi binarnymi i buforami?

AKTUALIZACJA:

Dowiedziałem się, co muszę zrobić. Zapytanie o curl jest pierwszą rzeczą, którą należy zmienić. Oto działający:

curl -kvX POST -F foobar=@my_image_name.jpg 'http://localhost:3031/upload/image'

Następnie dodałem linię do konwersji na strumień. Oto działający kod:

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()
            }
        });
    });
};

Aby załadować plik do punktu końcowego API (używając Node.js i Express) i przekazać ten plik do Amazon S3, najpierw należy wykonać żądanie POST z wypełnionym polem „pliki”. Plik kończy się po stronie API, gdzie prawdopodobnie znajduje się w jakimś katalogu tmp. Metoda Amazon S3 putObject wymaga strumienia, więc musisz utworzyć strumień odczytu, podając moduł „fs” ścieżkę, w której znajduje się przesłany plik.

Nie wiem, czy jest to właściwy sposób przesyłania danych, ale działa. Czy ktoś wie, czy istnieje sposób na binarne dane POST wewnątrz treści żądania i czy API wysyła to do S3? Nie do końca wiem, jaka jest różnica między przesyłaniem wieloczęściowym a standardowym POST do ciała.

questionAnswers(1)

yourAnswerToTheQuestion