开发者社区> 问答> 正文

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

阅读提示:阅读本帖需要有一定的专业编程基础。


用到的技术: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.逻辑复杂,不容易控制

展开
收起
cevin 2014-01-06 23:05:39 41132 0
11 条回答
写回答
取消 提交回答
  • Re如何直接上传文件至OSS,不用服务器中转
    这里有手机直传的文档和代码示例: https://help.aliyun.com/document_detail/31920.html?spm=5176.87240.400427.51.2IStxC
    直传后回调: https://help.aliyun.com/document_detail/31922.html?spm=5176.87240.400427.52.2IStxC
    直传的安全策略: https://help.aliyun.com/document_detail/31921.html?spm=5176.87240.400427.53.2IStxC
    必有一款适合你!
    2016-10-21 10:29:44
    赞同 展开评论 打赏
  • Re如何直接上传文件至OSS,不用服务器中转
    看文档上说是android接入sdk可以直接上传,同时传入回调接口,服务端接口就可以操作其它的额外的操作了
    2016-10-19 19:00:32
    赞同 展开评论 打赏
  • Re如何直接上传文件至OSS,不用服务器中转
    楼主你有没有android端的例子,有的话,能不能给我一份。 646869341@qq.com
    2016-04-25 15:49:33
    赞同 展开评论 打赏
  • Re如何直接上传文件至OSS,不用服务器中转
    我就中转。。。内网免费
    2015-01-19 09:45:20
    赞同 展开评论 打赏
  • Re如何直接上传文件至OSS,不用服务器中转
    php不懂,所以不敢质疑楼主,不过既然要直接上传oss而不经过服务器,编码生成认证字串这个并不是关键,那么你至少需要解决两个问题,1,跨域,2有客户端发起动作。
    恕我没看出来楼主是怎么解决的。能具体说下么。
    2014-04-30 11:45:30
    赞同 展开评论 打赏
  • Re如何直接上传文件至OSS,不用服务器中转
    直接上传会有安全问题,求解决办法
    2014-04-28 16:23:57
    赞同 展开评论 打赏
  • Re如何直接上传文件至OSS,不用服务器中转
    我第一次使用阿里云,图片资源按照网站架构来讲,确实放在OSS里面比较好。

    但是OSS有时会掉线,不知道为什么。www.useit.com.cn 可以测试速度

    -------------------------

    Re如何直接上传文件至OSS,不用服务器中转
    我就是OSS的忠实用户,也建议大家都用OSS,这是标准建站的架构。
    2014-01-20 10:09:37
    赞同 展开评论 打赏
  • Re如何直接上传文件至OSS,不用服务器中转
    http://www.studyingkey.com/http://www.studyingkey.com/data/upload/video/697/video/20131231/3873faf71ce06e68f02c094b44563b03.flv

    2014-01-08 15:22:44
    赞同 展开评论 打赏
  • 回2楼mayle的帖子
    可以看看七牛云存储。我一直有用的哦。完美解决

    -------------------------

    回 10楼(珑心) 的帖子
    移动端哪来的跨域?你的疑问貌似只存在于浏览器ajax请求

    -------------------------

    回 5楼(mayle) 的帖子
    qiniu callback
    2014-01-08 00:07:25
    赞同 展开评论 打赏
  • 取决于需求了,一般尽可能直接上传到OSS,上传到OSS跟上传到网站服务器是一样的,都存在失败之类的可能

    之前有人问,好像是因为针对DZ,discuz出于缩略图等情况的考虑,所以才无条件到网站服务器中转一次的,那也是无奈之举,暂时没有啥好的方法可以替代,PW之类的也都是一样处理的

    -------------------------

    回 3楼(cevin) 的帖子
    完美解决啥

    -------------------------

    回 6楼(useit_知识库) 的帖子
    掉线?啥叫掉线

    -------------------------

    回 6楼(useit_知识库) 的帖子
    另外,你的网站速度很慢
    2014-01-07 23:02:43
    赞同 展开评论 打赏
  • 元芳,阿里云云栖论坛总版主,phpwind官方论坛管理员,社区论坛领域应用专家。长期活跃在社区论坛建站领域,对各类社区论坛程序颇有研究!乐于交友,热心助人,以帮助和服务站长朋友为宗旨,帮助数以千计的站长朋友顺利建站!
    优秀文章-欢迎进行技术分享,感谢你的支持!
    2014-01-07 01:48:50
    赞同 展开评论 打赏
滑动查看更多
问答排行榜
最热
最新

相关电子书

更多
OSS运维进阶实战手册 立即下载
《OSS运维基础实战手册》 立即下载
OSS运维基础实战手册 立即下载