开发者社区> 问答> 正文

如何直接上传文件至OSS,不用服务器中转

cevin 2014-01-06 23:05:39 31753
阅读提示:阅读本帖需要有一定的专业编程基础。


用到的技术: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.逻辑复杂,不容易控制
存储 安全 API PHP 对象存储 iOS开发 内存技术
分享到
取消 提交回答
全部回答(11)
滑动查看更多

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程