使用此功能,我正在拍摄上传到我服务器的图像,将它们发送到aws S3存储桶,然后从我的机器中删除它们。这一切都很有效。
如何配置图像以便亚马逊将其作为公共场所并使用适当的内容类型(image / jpeg或image / png)?现在它默认为private和(application / octet-stream)。
这是我可以在节点中配置的吗?或者我需要在我的aws控制台中这样做吗?
function sendFileToAmazon(file) {
var s3bucket = new AWS.S3({
params: {Bucket: 'BUCKET NAME'}
});
var params = {Key: file.name, Body: ''};
fs.readFile(file.path, function(err, data) {
if (err) throw err;
params.Body = data;
s3bucket.putObject(params, function(errBucket, dataBucket) {
if (errBucket) {
console.log("Error uploading data: ", errBucket);
} else {
console.log(dataBucket);
deleteFileFromTmp(file);
}
});
});
}
答案 0 :(得分:25)
这是回答我问题的最佳来源,虽然我最初没有找到答案: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property
我在这里找到了答案: http://blog.katworksgames.com/2014/01/26/nodejs-deploying-files-to-aws-s3/
您可以简单地添加:
ContentType: file.mimetype, ACL: 'public-read'
到了参数,转过来:
var params = {Key: file.name, Body: ''};
到
var params = {Key: file.name, Body: '', ContentType: file.mimetype, ACL: 'public-read'};
<强> 编辑: 强>
除了提供文件的mimetype之外,您只能允许特定的mimetypes,例如:&#39; image / jpg&#39;,&#39; image / jpeg&#39;,&#39; image / png&#39;,&#39; image / gif&#39;等...
答案 1 :(得分:0)
我添加了以下ContentType来解决此问题。对于png或jpg,即使没有ContentType也可以使用。但是,如果要上传svg,则必须将ContentType属性发送到S3存储桶。
router.post(uploadImagePath, function (request, response) {
var form = new formidable.IncomingForm();
form.parse(request, (err, fields, files) => {
try {
let ImageName = files.file.name;
fs.readFile(files.file.path, function (err, data) {
let params = {
Bucket: 'Bucket-name',
Key: Date.now() + "_" + ImageName,
Body: data,
ACL: 'public-read',
ContentType: files.file.type
};
s3.upload(params, function (err, data) {
response.send(200, { key: data.key })
});
});
}
catch (e) {
response.send(500);
}
})
});