我主要参考
https://blog.csdn.net/violentbomb/article/details/82257973
https://blog.csdn.net/u012957549/article/details/77986463
特别是前一篇中的代码。唉,比官方文档简单多了。
--------------------------------------------------
基于临时授权方式的OSS上传
2018年08月31日 16:07:55 躁动de气球 阅读数:279更多
个人分类: 杂项 JavaScript
基于临时授权方式的OSS上传
OSS支持临时授权URL,可以实现临时性的上传和下载,此处介绍一下如何在项目中使用。
对应场景:客户端需要上传文件,但不想或不方便将accessKeyId和accessKeySecret下发到客户端,或者无法继承OSS-SDK的情况。
具体上传仍旧是客户端与OSS服务器之间直接进行.
应用的理论核心是OSS提供的”在URL中包含签名”,参考这里
实现思路:
客户端客户端业务服务器业务服务器OSS服务器OSS服务器[A]获取用于上传的临时URL[B]调用OSS-SDK生成临时URL[C]返回临时URL[D]使用临时URL上传文件[E]返回上传结果
代码实现
? [A] 客户端向业务服务器发送获取上传地址的请求,一般是POST请求,向服务器发送要上传的文件信息(如文件名)
? [B] 业务服务器收到对应请求后对用户身份做验证,通过后调用OSS-SDK或者手动生成对应的临时URL.
NodeJS下可以用以下代码生成: (业务服务器端)
var client = new OSS({
endpoint: configInfo.OSS_ENDPOINT,
accessKeyId: configInfo.OSS_KEY,
accessKeySecret: configInfo.OSS_SECERT,
bucket: configInfo.OSS_BUCKET
});
function getTempSignedUrl(ossObjectPath,type){
var url = client.signatureUrl(ossObjectPath, {
expires: 60, //过期时间,这里设置为短期的60s
method: 'PUT', //由于是上传,此处填写PUT; 如果是下载的话,为GET
'content-type': type||'application/octet-stream' //conent类型,默认为octet-stream
});
console.log(url);
return url;
}
? [C] 业务服务器将生成好的url返回客户端,也就是刚刚的POST请求的响应.
? [D] 客户端根据临时URL进行上传
web浏览器里面可以使用下面代码实现上传:(浏览器端)
function putfileToOSS(url, domId, contentType) {
var f = document.getElementById(domId); //input file控件
var uploadReq = new Request(url, { //url为服务器接口URL
method: "PUT",
headers: new Headers({ 'Content-Type': contentType||'application/octet-stream' }),
body: f.files[0] //仅支持单个文件,取第一个
});
return fetch(uploadReq).then(x => x.text()).then(x => {
console.log(x); //此处假定响应信息是text
return x;
});
}
? [E] OSS服务器返回上传结果,200为成功,其他为失败,常见的有403(过期或权限有误)等,具体信息参考OSS相关文档.
风险
临时URL有被泄露的可能性,请注意在业务层面做好安全保障,避免无意或有意泄露.
同样,临时URL的有效期不宜太长,时间过长该风险会变大.
可以通过制定content-type的方式进一步减少该风险.
待改进
要求更严格的情况下,可以在上述功能的基础上增加文件MD5的传递,也就是根据待上传文件的MD5生成临时URL,这样会对客户端有一定的要求,但安全性更高.(此种方案OSS支持)