Übergabe von Binärdaten an Amazon S3 mithilfe von Node.js

Ich versuche, mit Node.js ein Bild aufzunehmen und in einen Amazon S3-Bucket hochzuladen. Am Ende möchte ich das Bild auf S3 hochschieben und dann auf diese S3-URL zugreifen und das Bild in einem Browser anzeigen können. Ich verwende eine Curl-Abfrage, um eine HTTP-POST-Anforderung mit dem Bild als Hauptteil auszuführen.

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

Dann mache ich auf der Seite von Node.js Folgendes:

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

Meine Datei ist 0 Bytes, wie auf Amazon S3 gezeigt. Wie mache ich es so, dass ich mit Node.js die Binärdatei auf S3 hochschieben kann? Was mache ich falsch mit Binärdaten und Puffern?

AKTUALISIEREN:

Ich fand heraus, was ich tun musste. Die Curl-Abfrage ist das erste, was geändert werden sollte. Dies ist die Arbeit:

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

Dann habe ich eine Zeile hinzugefügt, die in einen Stream konvertiert werden soll. Dies ist der Arbeitscode:

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

Um eine Datei auf einen API-Endpunkt hochzuladen (mit Node.js und Express) und diese Datei von der API an Amazon S3 zu übertragen, müssen Sie zunächst eine POST-Anforderung mit dem Feld "files" ausführen. Die Datei endet auf der API-Seite, wo sie sich wahrscheinlich in einem tmp-Verzeichnis befindet. Für die S3 putObject-Methode von Amazon ist ein Stream erforderlich. Sie müssen also einen Lesestream erstellen, indem Sie dem Modul 'fs' den Pfad angeben, in dem sich die hochgeladene Datei befindet.

Ich weiß nicht, ob dies der richtige Weg ist, um Daten hochzuladen, aber es funktioniert. Weiß jemand, ob es eine Möglichkeit zum POST von Binärdaten im Anforderungshauptteil gibt und ob die API dies an S3 sendet? Ich weiß nicht genau, was der Unterschied zwischen einem mehrteiligen Upload und einem Standard-POST-to-Body ist.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage