前端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?

阅读 6.6k
5 个回答

一楼说用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 后的字符串绝对唯一。

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

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

用 uuid 足矣

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题