我为每个s3文件生成一个唯一的id。
然后,我保存s3响应url,其中包含数据库的密钥和文件/类型。
例如,当我更新了用户的个人资料照片时,它最初是jpg,但现在是png——我如何覆盖该照片/更新用户照片?
对此最好的方法是什么?
它必须是完全相同的文件名(包括文件类型)才能覆盖它,对吗?
这是我在Nodejs中的代码。
基本上,我创建了一个唯一的id,并将其与路径一起保存为S3密钥。
稍后,我将密钥保存到特定用户的数据库中。
exports.signing = function(req, res) {
var request = req.body;
//assigns unique id to each photo name
function generateUUID() {
var d = new Date().getTime();
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = (d + Math.random()*16)%16 | 0;
d = Math.floor(d/16);
return (c=='x' ? r : (r&0x3|0x8)).toString(16);
});
return uuid; };
var fileName = generateUUID();
var path = request.folder + fileName + request.type;
var readType = 'private';
var expiration = moment().add(5, 'm').toDate(); //15 minutes
var s3Policy = {
'expiration': expiration,
'conditions': [{
'bucket': aws.bucket
},
['starts-with', '$key', path],
{
'acl': readType
},
{
'success_action_status': '201'
},
['starts-with', '$Content-Type', request.type],
['content-length-range', 2048, 10485760], //min and max
]
};
var stringPolicy = JSON.stringify(s3Policy);
var base64Policy = new Buffer(stringPolicy, 'utf-8').toString('base64');
// sign policy
var signature = crypto.createHmac('sha1', aws.secret)
.update(new Buffer(base64Policy, 'utf-8')).digest('base64');
var credentials = {
url: s3Url,
fields: {
key: path,
AWSAccessKeyId: aws.key,
acl: readType,
policy: base64Policy,
signature: signature,
'Content-Type': request.type,
success_action_status: 201
}
};
res.jsonp(credentials);
};
正如您在场景中所说,您需要在数据库中保存对用户配置文件照片的规范引用。该值称为S3对象密钥
请注意,当你说:
我正在保存s3响应url,其中包含密钥和文件/类型到数据库
您所指的是数据S3对象密钥。对象密钥(或密钥名称)唯一地标识bucket中的对象。因此,您在DB中保存的是S3对象密钥。S3对象密钥看起来像以下示例:
John/profile.jpg
Private/25892e17-80f6-415f-9c65-7395332f0223.jpg
25892e17-80f6-415f-9c65-7395632f0225.gif
/app/profiles/25892e17-80f6-415f-9c65-7395632f0226.png
这些是您将与用户配置文件关联的值类型。因此,当上传新的用户档案图片时:
- 删除旧的对象键(如果存在)
- 上传新的
- 并使用新密钥更新DB