如何覆盖/更新不同文件类型的s3文件



我为每个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

这些是您将与用户配置文件关联的值类型。因此,当上传新的用户档案图片时:

  1. 删除旧的对象键(如果存在)
  2. 上传新的
  3. 并使用新密钥更新DB

最新更新