我正在尝试使用 Node.js 拍摄图像并将其上传到 Amazon S3 存储桶。最后,我希望能够将图像推送到 S3,然后能够访问该 S3 URL 并在浏览器中查看图像。我正在使用 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'
然后,我添加了一行来转换为 Stream。这是工作代码:
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,因此您需要通过为“fs”模块提供上传文件所在的路径来创建读取流。
我不知道这是否是上传数据的正确方法,但它有效。有谁知道是否有办法在请求正文中发布二进制数据并让 API 将其发送到 S3?我不太清楚多部分上传与标准 POST 到正文之间有什么区别。