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.