如何直接上传文件至OSS,不用服务器中转-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

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


用到的技术: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.逻辑复杂,不容易控制
取消 提交回答
全部回答(11)
  • mixlake
    2016-10-21 10:29:44
    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
    必有一款适合你!
    0 0
  • 易十八
    2016-10-19 19:00:32
    Re如何直接上传文件至OSS,不用服务器中转
    看文档上说是android接入sdk可以直接上传,同时传入回调接口,服务端接口就可以操作其它的额外的操作了
    0 0
  • chaoback
    2016-04-25 15:49:33
    Re如何直接上传文件至OSS,不用服务器中转
    楼主你有没有android端的例子,有的话,能不能给我一份。 646869341@qq.com
    0 0
  • 疯狂de队长
    2015-01-19 09:45:20
    Re如何直接上传文件至OSS,不用服务器中转
    我就中转。。。内网免费
    0 0
  • 珑心
    2014-04-30 11:45:30
    Re如何直接上传文件至OSS,不用服务器中转
    php不懂,所以不敢质疑楼主,不过既然要直接上传oss而不经过服务器,编码生成认证字串这个并不是关键,那么你至少需要解决两个问题,1,跨域,2有客户端发起动作。
    恕我没看出来楼主是怎么解决的。能具体说下么。
    0 0
  • roarhaole
    2014-04-28 16:23:57
    Re如何直接上传文件至OSS,不用服务器中转
    直接上传会有安全问题,求解决办法
    0 0
  • useit_知识库
    2014-01-20 10:09:37
    Re如何直接上传文件至OSS,不用服务器中转
    我第一次使用阿里云,图片资源按照网站架构来讲,确实放在OSS里面比较好。

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

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

    Re如何直接上传文件至OSS,不用服务器中转
    我就是OSS的忠实用户,也建议大家都用OSS,这是标准建站的架构。
    0 0
  • 天火
    2014-01-08 15:22:44
    Re如何直接上传文件至OSS,不用服务器中转
    http://www.studyingkey.com/http://www.studyingkey.com/data/upload/video/697/video/20131231/3873faf71ce06e68f02c094b44563b03.flv

    0 0
  • cevin
    2014-01-08 00:07:25
    回2楼mayle的帖子
    可以看看七牛云存储。我一直有用的哦。完美解决

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

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

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

    回 5楼(mayle) 的帖子
    qiniu callback
    0 0
  • mayle
    2014-01-07 23:02:43
    取决于需求了,一般尽可能直接上传到OSS,上传到OSS跟上传到网站服务器是一样的,都存在失败之类的可能

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

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

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

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

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

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

    回 6楼(useit_知识库) 的帖子
    另外,你的网站速度很慢
    0 0
  • 元芳
    2014-01-07 01:48:50
    优秀文章-欢迎进行技术分享,感谢你的支持!
    0 0
滑动查看更多
相关问答

1

回答

如何上传大文件到OSS?

2022-01-01 15:32:22 708浏览量 回答数 1

1

回答

【OSS】如何上传大文件到OSS

2021-11-17 19:50:42 2890浏览量 回答数 1

1

回答

OSS上传文件500

2018-11-12 15:35:05 366浏览量 回答数 1

1

回答

oss 上传文件

2018-10-12 14:12:01 762浏览量 回答数 1

1

回答

OSS上传不了文件

2018-08-14 13:05:30 1343浏览量 回答数 1

0

回答

OSS如何上传文件?

2017-10-17 15:00:00 4782浏览量 回答数 0

1

回答

Oss怎么上传大于5G的单个文件

2017-09-27 10:55:40 6969浏览量 回答数 1

1

回答

oss上传文件

2017-08-10 10:37:33 2267浏览量 回答数 1

4

回答

OSS上传大文件

2014-10-31 23:34:48 21274浏览量 回答数 4

1

回答

oss上传小文件

2013-12-23 17:02:11 6634浏览量 回答数 1
+关注
0
文章
99
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载