java 设计

OSS文件服务端签名上传回调

2019-09-25  本文已影响0人  IT菜鸟学习

背景

1、由于文件直接通过服务器再到文件存储服务会验证影响到服务的性能,要是存在大批量文件的行为,可能会直接拖垮服务;目前我们使用OSS文件存储服务,OSS文件存储支持上传回调,这样会减少服务器压力和网络带宽;
 2、采用服务端签名后直传方案有个问题:大多数情况下,用户上传数据后,应用服务器需要知道用户上传了哪些文件以及文件名;如果上传了图片,还需要知道图片的大小等。

解决思路

使用OSS官网介绍方案,利用OSS官网的对应语言的操作示例,来实现我们需要的方案

方案介绍

详细流程

image.png

1、流程如下:
用户向应用服务器请求上传Policy和回调。
应用服务器返回上传Policy和回调设置。
用户直接向OSS发送文件上传请求。
OSS根据用户的回调设置,发送回调请求给应用服务器。
应用服务器返回响应给OSS。
OSS将应用服务器返回的内容返回给用户。

policy封装(类似token的权限校验+需要的参数)

2、内容解析如下:

CallbackUrl:OSS往这个服务器发送的URL请求。
callbackHost:OSS发送这个请求时,请求头部所带的Host头。
callbackBody:OSS请求时,发送给应用服务器的内容,可以包括文件的名称、大小、类型。如果是图片,可以是图片的高度、宽度。
callbackBodyType:请求发送的Content-Type。

3、客户端/web上传
 客户端/web上传图片,是根据返回的policy信息,把对应的图片文件上传到服务器,上传后会有个回调地址,从服务端返回,客户端可以根据返回内容判断是否上传成功。
 在客户端源码upload.js文件中,callbackbody的值是步骤2中应用服务器返回给客户端消息body中callback的内容。如下代码是官网例子:

new_multipart_params = {
     'key' : key + '${filename}',
     'policy': policyBase64,
     'OSSAccessKeyId': accessid,
     'success_action_status' : '200', //让服务端返回200,不设置则默认返回204
     'callback':  callbackbody,
     'signature': signature,
 };

遇到的问题

1、由于对接的图片加密上传有web端、JAVA、python、c++等一些服务,有c++的对接的同事反应会存在一些问题,改成python进行封装。由于对接服务语言较多,参考OSS官网会没有封装成SDK进行处理,会有有一些语言的操作示例,需要根据官网进行对接。
 2、之前上传图片存在几万或者几十万张的级别上传的情况下,有反馈请求反应太慢,后面排查是客户端进行多线程操作,把带宽拉满,导致部分图片上传失败,建议对接注意该问题,防止文件丢失。

总结

参考OSS的设计,避免了很多不必要的性能,还增加一些流程的闭环;在以后设计一些中间件和业务代码的过程中可以借鉴类似方式;

参考文章:https://help.aliyun.com/document_detail/31927.html?spm=a2c4g.11186623.6.1372.11174367XkuM4R

上一篇 下一篇

猜你喜欢

热点阅读