我正在研究这个项目,我设法通过我在环回模型上创建的端点上传图像,问题是我需要上传的图像可公开访问,似乎无法找到在哪里这样做。 我已经尝试使用aws sdk用putObjectACL更改对象权限但无法使其工作,它说我已经错误地构建了xml,因为我甚至无法计算如何填充方法所需的属性,所以我找到了改变它的方法,就是复制它并将ACL设置为'public-read'然后删除原始文件,然后再将其复制到原始文件名并再次删除其他副本,看起来像是一个非常顽皮的解决方案,我很确定必须有一个更简洁的方法来做到这一点。 我使用我的远程方法进行上传:
Container.upload(req,res,{container: "my-s3-bucket"},function(err,uploadInfo) { ... }
Container是我的模型连接到aws s3。然后我像这样进行权限更改(复制和删除):
var AWS = require('aws-sdk');
AWS.config.update({accessKeyId:"my-key-id",secretAccessKey:"my-key", region:"us-east-1"});
var s3 = new AWS.S3();
s3.copyObject( {
Bucket:'my-s3-bucket',
CopySource: 'my-s3-bucket/'+filename,
Key: filename+"1",
ACL: 'public-read'
}, function(err,info) {
if (err) return cb(err);
s3.deleteObject( {
Bucket:'my-s3-bucket',
Key:filename
}, function(err,info) {
if (err) return cb(err);
s3.copyObject( {
Bucket: 'my-s3-bucket',
CopySource: 'my-s3-bucket/'+filename+"1",
Key: filename,
ACL: 'public-read'
}, function(err,info) {
if (err) return cb(err);
s3.deleteObject( {
Bucket: 'my-s3-bucket',
Key: my-s3-bucket+"1"
}, function(err,info) {
if (err) return cb(err);
cb(null,uploadInfo);
})
})
})
});
我想知道是否有更清洁的东西:
Container.upload(req,res,{container: "my-s3-bucket", ACL:'public-read'},function(err,uploadInfo) { ... }
提前致谢:)
答案 0 :(得分:5)
对不起,这有点晚了但答案就在这里:
https://github.com/strongloop/loopback-component-storage/pull/47
他们增加了对应用acls和其他一些东西的支持:
var dsImage = loopback.createDataSource({
connector: require('loopback-component-storage'),
provider: 'filesystem',
root: path.join(__dirname, 'images'),
getFilename: function(fileInfo) {
return 'image-' + fileInfo.name;
},
acl: 'public-read',
allowedContentTypes: ['image/png', 'image/jpeg'],
maxFileSize: 5 * 1024 * 1024
});
将该acl放入' public-read',就可以了。
答案 1 :(得分:1)
所以最后我不得不丢弃整个loopback组件存储,因为我还需要从文件中获取一些额外的参数,我用formidable解析表单并直接用aws sdk上传文件,就像这样:
var formidable = require('formidable');
var form = new formidable.IncomingForm();
form.parse(req, function(err,fields,files) {
if (err) return cb(err);
var fs = require('fs');
var AWS = require('aws-sdk');
AWS.config.update({
accessKeyId:"my-key-id",
secretAccessKey:"my-key",
region:"us-east-1"
});
var s3 = new AWS.S3();
s3.putObject({
Bucket:'shopika',
Key: files.file.name,
ACL:'public-read', //Public plz T^T
Body: fs.createReadStream(files.file.path),
ContentType:files.file.type
}, function(err,data) {
if (err) return cb(err);
//Upload success, now I have the params I wanted in 'fields' and do my stuff with them :P
cb(null,data);
});
});