php数据上传到oss php数据上传到服务器( 三 )


expire = parseInt(obj['expire'])
key = obj['dir']
现在咱们来一起解析一下xmlhttp.responseText(这个是我设计的范围,并不一定要求是以下的格式,但是必须有signature, accessid, policy这三个值)复制代码
{"accessid":"6MKOqxGiGU4AUk44",
"host":"","policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDoyMzoyM1oiLCJjxb25kaXRpb25zIjpbWyJjcb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8iXV19","signature":"I2u57FWjTKqX\/AE6doIdyff151E=","expire":1446726203,"dir":"user-dir/"}
第一个变量accessid: 指的用户请求的accessid,注意单知道accessid, 对数据不会有影响 。
第二个变量host: 指的是用户要往哪个域名发往上传请求 。
第三个变量policy:指的是用户表单上传的策略policy, 是经过base64编码过的字符串第四个变更signature:是对上述第三个变量policy签名后的字符串第五个变量expire:指的是当前上传策略失效时间,这个变量,并不是用来发送到OSS,因为这个已经指定在policy里面,这个变量的含义,后面讲 。
现在咱们分析一下policy的内容,将其解码后的内容是:
复制代码
{"expiration":"2015-11-05T20:23:23Z",
"conditions":[["content-length-range",0,1048576000],["starts-with","$key","user-dir\/"]]
这里有一个关键的地方,PolicyText指定了该Policy 上传失效的最终时间 。即在这个失效时间之前,都可以利用这个policy上传文件 , 所以没有必要每次上传,都去后端取签名 。减少后端的压力 。在这里我的设计是:初始化上传时,每上传一个文件后,取一次签名 。然后再上传时,将当前时间跟签名时间对比,看是签名时间是否失效了 。如果失效了 , 就重新取一次签名,如果没有失效就不取 。这里就用到了第五个变量expire核心代码如下:
复制代码
now = timestamp = Date.parse(new Date()) / 1000;[color=#000000]//可以判断当前expire是否超过了当前时间,如果超过了当前时间,就重新取一下.3s 做为缓冲[/color]
if (expirenow + 3)
{
.....
phpUrl = './php/get.php'
xmlhttp.open( "GET", phpUrl, false );
xmlhttp.send( null );
......
}
return .
再看一下上面policy 的内容比上面增加了starts-with, 这个指定此次上传的文件名,必须是user-dir开头(这个字符串,用户可以自己指定)为什么要增加这个的含义是:很多场景,一个应用一个bucket,不同用户的数据 , 为了防止数字覆盖,每个人上传到OSS,可以有特定的前缀 。那么问题来了,那用户获取到这个policy后,是不是在失效期内,都能修改上传前缀 , 从而上传到别人的目录呢?所以 , 应用服务器可以在上传时就指定让用户传文件时,必须是某个前缀 。如果用户拿到了policy他也没有办法上传别人的前缀上 。保证了数据的安全性 。
终级篇--应用服务器php返回签名及采用上传回调背景
当采用第二个方案后 , 问题来了,用户来了数据,并且上传数据后,很多场景下 , 应用服务器都要知道用户上传了哪些文件,文件名字,甚至如果是图片的话,图片的大小等 。为此OSS开发了上传回调功能 。
千万注意
上传回调功能目前只开放了两个域,杭州跟北京(即通过oss.aliyuncs.com, oss-cn-hangzhou.aliyuncs.com, oss-cn-beijing.aliyuncs.com这三个域名能调用上传回调) 。只有上传域名是这两个域 , 才能调用上传回调 。
增加了请求回调后,用户的请求逻辑如下:
第一:用户先向应用服务器取到上传policy和回调设置第二:应用服务器返回上传policy和回调
第二:用户直接向OSS发送文件上传请求

推荐阅读