添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
阳刚的甜瓜  ·  SQL ...·  1 年前    · 
刚失恋的鸵鸟  ·  How to search JSON ...·  1 年前    · 
玩命的奔马  ·  java:执行linux ...·  2 年前    · 
  • 使用OSS中的数据作为机器学习的训练样本
  • DataLakeAnalytics+OSS:基于OSS的Severless的交互式查询分析
  • 通过HDP2.6 Hadoop读取和写入OSS数据
  • 通过CDH5 Hadoop读取和写入OSS数据
  • Apache Impala(CDH6)查询OSS数据
  • Spark使用OSS Select加速数据查询
  • 基于OSS+MaxCompute构建数据仓库
  • 数据备份和容灾
  • 备份存储空间
  • 数据库备份到OSS
  • 通过云存储网关使用OSS服务
  • 本地共享文件夹访问
  • 本地磁盘访问
  • OSS上传提示Name or service not known报错
  • osscmd工具上传提示InvalidBucketName报错
  • 调用Callback时页面显示400 call back error
  • OSS服务.netSDK中使用MemoryStream上传文件为空的解决方法
  • OSS下载rar格式文件,打开后乱码
  • IE浏览器下载OSS文件后扩展名被省略
  • OSS支持FTP吗?
  • OSS文件实现强制下载的方法
  • OSS Post请求的Policy设置方法
  • OSS通过range参数获取部分文件
  • OSS的文件更新后,部分地区下载的文件仍是旧的版本
  • 在OSS控制台中读请求与写请求次数统计的来源
  • 使用OSS的JS SDK上传大于100K的文件时报错
  • OSS验证Refer防盗链是否生效
  • OSS变通实现IP黑白名单
  • STS生成的临时账户授权检查逻辑
  • OSS的Bucket权限管理
  • 如何获取AccessKeyId和AccessKeySecret
  • Access key对OSS的bucket控制权限太高,需要对bucket更细粒度的权限控制
  • RAM子账户授权OSS单个bucket中部分文件的访问权限
  • oss域名访问提示Anonymous access is forbidden for this operation.
  • OSS细粒度的权限控制
  • OSS异常流量排查及防护
  • 如何给子账号赋权OSS的操作?
  • 如何授权RAM子账号列举指定文件目录
  • Python sdk中multiupload上传如何验证文件完整性
  • OSS MD5一致性校验说明
  • OSS下载内容与实际内容不一致
  • 域名/网络
  • OSS如何查看Bucket内网、外网域名地址
  • ECS用户如何正确使用OSS内网地址?
  • OSS是否支持Bucket作为三级域名的访问方式?
  • OSS是否支持HTTPS访问
  • 通过反向代理访问OSS的HTTPS域名
  • OSS+CDN访问文件直接下载
  • OSS设置Object更新时自动刷新CDN缓存
  • OSS使用SDK访问Bucket提示Endpoint错误
  • OSS设置CORS规则以后还是报No 'Access-Control-Allow-Origin'的解决方法
  • 访问OSS资源或者使用SDK时提示“ using the specified endpoint”
  • OSS绑定域名时验证域名所有权
  • 为什么OSS内网域名无法ping通
  • DNS解析
  • 站点中如何应用OSS资源
  • OSS如何开启CDN加速服务
  • OSS触发FIN的条件
  • OSS上传或下载的带宽限制
  • OSS上传慢
  • 如何停止绑定域名时默认开启的CDN服务?
  • 如何设置HTTPS证书托管
  • 对象存储OSS中Bucket的访问域名使用介绍
  • 对象存储OSS查看Bucket统计和Object统计方法
  • 通过OSS控制台资源监控报表功能了解Bucket使用情况
  • 通过OSS控制台概览了解Bucket相关属性
  • OSS通过管理控制台查看资源监控报表的请求次数统计信息
  • 如何授权子账号云查看OSS控制台总概览的基础数据
  • 存储空间(bucket)管理
  • 如何获取OSS上每个文件夹的大小
  • OSS中可以重命名Bucket吗?是否支持Object迁移?
  • OSS如何一键删除Bucket
  • OSS对object和目录的移动与修改操作
  • OSS的Bucket、Object、文件目录命名规范汇总
  • OSSFS通过www账户挂载Bucket
  • OSS API设置LifeCycle提示时间格式错误
  • OSS开启访问日志
  • 查找OSS Object的访问操作记录
  • OSS日志里面206代表什么
  • OSS的Bucket每天会自动生成名称中包含日期的Object
  • OSS数据操作常见问题FAQ
  • Bucket下出现异常文件如何排查
  • 如何查看存储空间大小
  • OSS可创建Bucket个数限制,容量是否需要扩容?
  • 如何删除Bucket
  • 文件(object)管理
  • OSS怎么更改Object元数据信息
  • OSS中LifeCycle删除文件的策略
  • 判断OSS文件被删除
  • OSS删除碎片文件
  • 当Object名称中存在不可见字符如何处理?
  • OSS有哪些批量操作?
  • OSS静态文件的打开方式
  • OSS的gzip压缩如何使用?
  • IE浏览器中浏览OSS的object URL中文文件名乱码
  • OSS 如何设置 Content-Type(MIME)?
  • 上传Object后如何获取访问URL
  • 如何给文件重命名
  • 如何修改、更新、编辑文件?
  • OSS上传文件大小限制
  • OSS SDK如何进行批量操作?
  • Java实现生成URL签名的代码示例
  • PHP实现OSS的签名URL
  • OSS如何通过sdk获取object的签名URL
  • OSS中的时间标准
  • 控制台获取签名链接后过一段时间超时
  • 调用oss sdk操作报错:SignatureDoesNotMatch
  • Object签名URL相关问题
  • 签名错误 (signature not match)
  • API/SDK
  • OSS支持时间同步的sdk
  • nternal.aliyuncs.com...
  • Oss Java sdk实现listobject(列出所有的object)
  • 使用OSS的javasdk的contentMD5出现log4j警告
  • OSS Java SDK超时&重传代码样例
  • 测试版PHP SDK中不能自动检测所需PHP模块的原因
  • OSS API文档 “Date”字段的GMT格式说明
  • - assumed...
  • OSS API返回结果有JSON格式的吗?
  • Python sdk查询所有object列表
  • iOS SDK和Android SDK如何开启log?
  • OSS图片处理服务不支持ICO格式图片
  • OSS图片处理服务绑定域名时提示:域名绑定在自己的其他Bucket上
  • 对象存储OSS控制台操作—图片鉴黄
  • OSS上传图片时exif信息处理规则
  • PHP SDK 2.0.1是否支持图片处理服务
  • OSS 图片处理服务配置文件缓存的方法
  • 怎样用多个域名来使用oss图片服务
  • 图片处理服务处理后的PNG图片的透明背景变黑
  • OSS 图片处理如何保护原始图片不被访问
  • OSS图片处理访问报Forbidden access to the original image错误的处理方法
  • 使用图片处理服务,原图无法访问。报错accessdenied。
  • OSS图片处理服务导致CORS配置失效
  • OSS图片处理URL访问报错NoSuchStyle, NoSuchKey, NoSuchFile
  • 图片的原图是正常的,被图片处理后就旋转了,该怎样处理
  • OSS图片处理对原图和缩略图的限制说明
  • OSS 如何将图片强制缩放成正方形并且不裁剪
  • 图片处理服务是否可以支持跨域操作
  • OSS上传图片访问URL返回http code值为403
  • 采用 服务端签名后直传 方案有个问题:大多数情况下,用户上传数据后,应用服务器需要知道用户上传了哪些文件以及文件名;如果上传了图片,还需要知道图片的大小等,为此OSS提供了上传回调方案。

    流程如下图所示:

    当用户要上传一个文件到OSS,而且希望将上传的结果返回给应用服务器时,需要设置一个回调函数,将请求告知应用服务器。用户上传完文件后,不会直接得到返回结果,而是先通知应用服务器,再把结果转达给用户。

    服务端签名直传并设置上传回调提供了以下语言的操作示例:
  • Python
  • 以下根据流程讲解核心代码和消息内容。

  • 用户向应用服务器请求上传Policy和回调。

    在客户端源码中的 upload.js 文件中,如下代码片段的变量 serverUrl 的值可以用来设置应用服务器的URL。设置好之后,客户端会向该 serverUrl 发送Get请求来获取需要的信息。

    // serverUrl是用户获取签名和Policy等信息的应用服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
    serverUrl = 'http://88.88.88.88:8888'
  • 应用服务器返回上传Policy和回调设置代码。

    应用服务器侧的签名直传服务会处理客户端发过来的Get请求消息,您可以设置对应的代码让应用服务器能够给客户端返回正确的消息。各个语言版本的配置文档中都有明确的说明供您参考。

    下面是签名直传服务返回给客户端消息Body内容的示例,这个Body的内容将作为客户端上传文件的重要参数。

    {
    "accessid":"6MKO******4AUk44",
    "host":"http://post-test.oss-cn-hangzhou.aliyuncs.com",
    "policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDo1Mjoy******Jjdb25kaXRpb25zIjpbWyJjdb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8iXV19",
    "signature":"VsxOcOudx******z93CLaXPz+4s=",
    "expire":1446727949,
    "callback":"eyJjYWxsYmFja1VybCI6Imh0dHA6Ly9vc3MtZGVtby5hbGl5dW5jcy5jdb206MjM0NTAiLCJjYWxsYmFja0hvc3QiOiJvc3MtZGVtby5hbGl5dW5jcy5jdb20iLCJjYWxsYmFja0JvZHkiOiJmaWxlbmFtZT0ke29iamVjdH0mc2l6ZT0ke3NpemV9Jm1pbWVUeXBlPSR7bWltZVR5cGV9JmhlaWdodD0ke2ltYWdlSW5mby5oZWlnaHR9JndpZHRoPSR7aW1hZ2VJdbmZvLndpZHRofSIsImNhbGxiYWNrQm9keVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifQ==",
    "dir":"user-dirs/"
    }

    上述示例的callback内容采用的是Base64编码。经过Base64解码后的内容如下:

    {"callbackUrl":"http://oss-demo.aliyuncs.com:23450",
    "callbackBody":"filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}",
    "callbackBodyType":"application/x-www-form-urlencoded"}
  • callbackUrl:OSS往这个服务器发送的URL请求。
  • callbackHost:OSS发送这个请求时,请求头部所带的Host头。
  • callbackBody:OSS请求时,发送给应用服务器的内容,可以包括文件的名称、大小、类型。如果是图片,可以是图片的高度、宽度。
  • callbackBodyType:请求发送的Content-Type。
  • 用户直接向OSS发送文件上传请求。

    在客户端源码 upload.js 文件中, callbackbody 的值是步骤2中应用服务器返回给客户端消息Body中Callback的内容。

    new_multipart_params = {
         'key' : key + '${filename}',
         'policy': policyBase64,
         'OSSAccessKeyId': accessid,
         // 设置服务端返回状态码为200,不设置则默认返回状态码204。
         'success_action_status' : '200', 
         'callback':  callbackbody,
         'signature': signature,
          
  • OSS根据用户的回调设置,发送回调请求给应用服务器。

    客户端上传文件到OSS结束后,OSS解析客户端的上传回调设置,发送Post回调请求给应用服务器。消息内容大致如下:

    Hypertext Transfer Protocol
        POST / HTTP/1.1\r\n
        Host: 47.97.168.53\r\n
        Connection: close\r\n
        Content-Length: 76\r\n
        Authorization: fsNxFF0w******MNAoFb//a8x6v2lI1******h3nFUDALgku9bhC+cWQsnxuCo******tBUmnDI6k1PofggA4g==\r\n
        Content-MD5: eiEMyp7lbL8KStPBzMdr9w==\r\n
        Content-Type: application/x-www-form-urlencoded\r\n
        Date: Sat, 15 Sep 2018 10:24:12 GMT\r\n
        User-Agent: aliyun-oss-callback\r\n
        x-oss-additional-headers: \r\n
        x-oss-bucket: signedcallback\r\n
        x-oss-owner: 15447******20439\r\n
        x-oss-pub-key-url: aHR0cHM6Ly9nb3NzcHVibGljLm******bi5jb20vY2FsbGJhY2tfcHViX2tleV92MS5wZW0=\r\n
        x-oss-request-id: 5B9CDDCC9******88AE2BEA1\r\n
        x-oss-requester: 15447******20439\r\n
        x-oss-signature-version: 1.0\r\n
        x-oss-tag: CALLBACK\r\n
        eagleeye-rpcid: 0.1\r\n
        [Full request URI: http://47.xx.xx.53/]
        [HTTP request 1/1]
        [Response in frame: 39]
        File Data: 76 bytes
    HTML Form URL Encoded: application/x-www-form-urlencoded
        Form item: "filename" = ".snappython.png"
        Form item: "size" = "6014"
        Form item: "mimeType" = "image/png"
        Form item: "height" = "221"
  • 应用服务器返回响应给OSS。

    应用服务器根据OSS发送消息中的authorization来进行验证,如果验证通过,则向OSS返回如下JSON格式的成功消息。

    {
    "String value": "ok",
    "Key": "Status"
          
  • OSS将应用服务器返回的消息返回给用户。
  • 客户端源码解析

    客户端源码下载地址: aliyun-oss-appserver-js-master.zip 说明 客户端JavaScript代码使用的是Plupload组件。Plupload是一款简单易用且功能强大的文件上传工具, 支持多种上传方式,包括HTML、Flash、SilverLight、HTML4。它会智能检测当前环境,选择最适合的上传方式,并且会优先采用HTML5方式。详情请参见 Plupload官网

    下面举例介绍几个关键功能的代码实现:

  • 设置成随机文件名

    若上传时采用固定格式的随机文件名,且后缀跟客户端文件名保持一致,可以将函数改为:

    function check_object_radio() {
        g_object_name_type = 'random_name';
          
  • 设置成用户的文件名

    如果想在上传时设置成用户的文件名,可以将函数改为:

    function check_object_radio() {
        g_object_name_type = 'local_name';
          
  • 设置上传目录 上传的目录由服务端指定, 每个客户端只能上传到指定的目录,实现安全隔离。下面的代码以PHP为例,将上传目录改成abc/,注意目录必须以正斜线(/)结尾。
    $dir ='abc/';
  • 设置上传过滤条件

    您可以利用Plupload的属性filters设置上传的过滤条件,如设置只能上传图片、上传文件的大小、不能有重复上传等。

    var uploader = new plupload.Uploader({
        filters: {
            mime_types : [ 
            // 只允许上传图片和ZIP文件。
            { title : "Image files", extensions : "jpg,gif,png,bmp" },
            { title : "Zip files", extensions : "zip" }
            // 最大只能上传400KB的文件。
            max_file_size : '400kb', 
            // 不允许选取重复文件。
            prevent_duplicates : true 
            
  • mime_types:限制上传的文件后缀。
  • max_file_size:限制上传的文件大小。
  • prevent_duplicates:限制不能重复上传。
  • 获取上传后的文件名

    如果要知道文件上传成功后的文件名,可以用Plupload调用FileUploaded事件获取,如下所示:

    FileUploaded: function(up, file, info) {
                if (info.status == 200)
                    document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = 'upload to oss success, object name:' + get_uploaded_object_name(file.name);
                    document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = info.response;
        }

    可以利用get_uploaded_object_name(file.name)函数,得到上传到OSS的文件名,其中file.name记录了本地文件上传的名称。

  • 上传签名

    JavaScript可以从服务端获取policyBase64、accessid、signature这三个变量,核心代码如下:

    function get_signature()
        // 判断expire的值是否超过了当前时间,如果超过了当前时间,就重新获取签名,缓冲时间为3秒。
        now = timestamp = Date.parse(new Date()) / 1000; 
        if (expire < now + 3)
            body = send_request()
            var obj = eval ("(" + body + ")");
            host = obj['host']
            policyBase64 = obj['policy']
            accessid = obj['accessid']
            signature = obj['signature']
            expire = parseInt(obj['expire'])
            callbackbody = obj['callback'] 
            key = obj['dir']
            return true;
        return false;
    };

    从服务端返回的消息解析如下:

    {"accessid":"6MKO******4AUk44",
    "host":"http://post-test.oss-cn-hangzhou.aliyuncs.com",
    "policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDoyMzoyM1oiLCJjxb25kaXRpb25zIjpbWyJjcb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8iXV19",
    "signature":"I2u57FWjTKqX/AE6doIdyff151E=",
    "expire":1446726203,"dir":"user-dir/"}
  • accessid:用户请求的accessid。
  • host:用户要往哪个域名发送上传请求。
  • policy:用户表单上传的策略(Policy),是经过Base64编码过的字符串。详情请参见Post Policy
  • signature:对Policy签名后的字符串。
  • expire:上传策略Policy失效时间,在服务端指定。失效时间之前都可以利用此Policy上传文件,无需每次上传都去服务端获取签名。
  • 说明 为了减少服务端的压力,设计思路是:初始化上传时,每上传一个文件,获取一次签名。再上传时,比较当前时间与签名时间,看签名时间是否失效。如果失效,就重新获取一次签名,如果没有失效,就使用之前的签名。

    解析Policy的内容如下:

    {"expiration":"2015-11-05T20:23:23Z",
    "conditions":[["content-length-range",0,1048576000],
    ["starts-with","$key","user-dir/"]]

    上面Policy中增加了starts-with,用来指定此次上传的文件名必须以user-dir开头,用户也可自行指定。增加starts-with的原因是:在很多场景下,一个应用对应一个Bucket,为了防止数据覆盖,每个用户上传到OSS的文件都可以有特定的前缀。但这样存在一个问题,用户获取到这个Policy后,在失效期内都能修改上传前缀,从而上传到别人的目录下。解决方法为,在应用服务器端就指定用户上传文件的前缀。如果用户获取了Policy也没有办法上传到别人的目录,从而保证了数据的安全性。

  • 设置应用服务器的地址

    在客户端源码upload.js文件中,如下代码片段的变量serverUrl的值可以用来设置应用服务器的URL,设置好之后,客户端会向该serverUrl发送Get请求来获取需要的信息。

    // serverUrl是用户获取签名和Policy等信息的应用服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
    serverUrl = 'http://88.88.88.88:8888'
  • 前端如何实现批量上传文件?

    OSS没有开放批量上传接口,如果需要批量上传,您可以使用一个循环去上传所有文件,示例与单个上传一致。

  •