阅读提示:阅读本帖需要有一定的专业编程基础。
用到的技术:php、android(以移动端举例,WEB、IOS、Flash等略同)
OSS真的是个好东西,不用过多的去描述了。这几天看到论坛里部分帖子都在问怎么上传文件直接到oss而非先上传到服务器中转。这里简单的描述一下。
首先,OSS可以在外部直接访问,而不需要一定通过内网服务器上传。然后结合官方的API接口文档,可以轻松的实现将文件直接上传到OSS。
根据API接口文档得知,所谓的文件上传是将各种参数按照一定的规律组成签名,然后把签名放到HTTP请求中,拼凑URL后上传文件。由此,我们进行如下操作:
1.Android获取需要上传的文件MD5值或文件大小
2.将获取的参数发送给服务器接口
3.服务器接口生成URL和其余需要的参数回馈给客户端
4.客户端执行文件上传
5.通知上传结果
具体举例如下:
服务端接口:
<?php
// 仅作示范 线上环境自行进行权限验证及数据过滤等安全处理
// 获取客户端发送的数据
# 文件大小或md5值
$file_md5 = $_POST['file_md5'];
# 获取欲上传的文件名(存储到OSS中的文件名或路径)
$filepath = $_POST['filepath'];
# 处理文件路径
$filepath = $filepath{0} == '/' ? $filepath : "/{$filepath}";
// 定义密钥
$access_key = '';
$secret_key = '';
// 定义bucket名称
$bucket = '';
// 拼凑上传文件地址
# 青岛节点自行更换url
# 可能的结果: http://bucket-name.oss-cn-hangzhou.aliyuncs.com/Y/m/d/id.jpg
$upload_url = 'http://'.$bucket.'.oss-cn-hangzhou.aliyuncs.com'.$filepath;
// 定义MIME Type
# 根据文件名后缀自行决定MIME类型
$content_type = '';
// 组织签名数据
$sign_data = array(
'PUT',
$file_md5,
$content_type,
gmdate('D, d M Y H:i:s \G\M\T'),
"/{$bucket}$filepath"
);
$sign_str = implode("\n",$sign_data);
$sign = base64_encode(hash_hmac('sha1',$sign_str,$secret_key,1));
// 定义输出结果
$response = array(
'upload_url' => $upload_url,
'auth' => "OSS {$access_key}:{$sign}",
'content-type' => $content_type,
);
echo json_encode($response,15);
ok,客户端收到服务端的反馈,直接上传文件内容到upload_url并且携带Header参数Authorization的值:auth即可。
上传完成后再通知服务器文件已经上传完成。
缺点:
1.容易引发因为用户网络问题导致的文件上传成功,但是通知服务器失败的情况
2.逻辑复杂,不容易控制
-------------------------
http://www.studyingkey.com/http://www.studyingkey.com/data/upload/video/697/video/20131231/3873faf71ce06e68f02c094b44563b03.flv
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。