前端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?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
使用md5+时间戳或者使用uuid
正常应该是请求后端,获取一代段token签名,里面有需要的key
用 uuid 足矣
一楼说用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 后的字符串绝对唯一。