前端oss 直传如何保证Key 唯一?

我使用的框架是uni-app。开发app。

上传文件代码

/**
* 此处key 截取方法是参照oss最佳实践里的
* 如果res.filePath为"file:///storage/emulated/0/DCIM/Camera/41aa3f433bb3b368fcc0eda32a7364f6.mp4"
此处的key就为 '/41aa3f433bb3b368fcc0eda32a7364f6.mp4'
*/
let key = res.filePath.substr(p1.filePath.lastIndexOf('/') + 1);
cos.postObject({
    Bucket: 'examplebucket-1250000000',
    Region: 'ap-beijing',
    Key: key,
    FilePath: tmpFilePath, // wx.chooseImage 选择文件得到的 tmpFilePath
    onProgress: function (info) {
        console.log(JSON.stringify(info));
    }
}, function (err, data) {
    console.log(err || data);
});

查阅腾讯oss 文档得知key规范:* 对象键(ObjectKey):对象键是对象在存储桶中的唯一标识。
腾讯oss 文档

但是作为前端,我很难保证这个key 唯一

于是我在网上搜索前端生成唯一id的方法

function guid() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
        return v.toString(16);
    });
}

我想问下你们是怎么做的?这个方法可用吗?
如何生成一个唯一id?

阅读 1.1k
评论
    5 个回答
    • 15

    一楼说用uuid,其实也是不对的。
    因为用的最为广泛的uuid v4 版本是随机生成的,他无法保证唯一。随机的意思就是第一次随机结果为1,第二次随机结果也有可能是1,他只是几率小,但不能保证绝对唯一。
    你们可能会说uuid 会拿mac 地址什么的。但是你仔细读那个uuid 文档就会发现,并没有说会拿地址,而且我开发的是app,你确定能拿到mac地址?。
    不管你们查询uuid有多安全,我承认,但请注意,这是js 生成的,并且v4 版本明确表示是随机的。

    我的最终解决方案是 ${uuid}-md5(${(token/userid)-${Date.now()}})

    uuid + md5(token + 时间戳)

    绝对的唯一。同一时间,token 绝对唯一。token 相同时,时间戳必然不同,从而保证了md5 后的字符串绝对唯一。

      • 47.1k

        使用md5+时间戳或者使用uuid

          正常应该是请求后端,获取一代段token签名,里面有需要的key

            用 uuid 足矣

              撰写回答

              登录后参与交流、获取后续更新提醒

              相似问题
              推荐文章