详情页标题前

阿里云对象存储OSSRuby-云淘科技

详情页1

本文以Ruby语言为例,讲解在服务端通过Ruby代码完成签名,并且设置上传回调,然后通过表单直传数据到OSS

前提条件

  • 应用服务器对应的域名可通过公网访问。
  • 确保应用服务器已经安装Ruby 2.0以上版本(执行ruby -v命令进行查看)。
  • 确保PC端浏览器支持JavaScript。

步骤1:配置应用服务器

  1. 下载应用服务器源码(Ruby版本)。
  2. 以Ubuntu 16.04为例,将文件解压到/home/aliyun/aliyun-oss-appserver-ruby目录下。
  3. 进入该目录,打开源码文件appserver.rb,修改如下代码片段:
    # 请填写您的AccessKeyId。
    $access_key_id = ''
    
    # 请填写您的AccessKeySecret。
    $access_key_secret = ''
    
    # $host的格式为bucketname.endpoint,请替换为您的真实信息。
    $host = 'https://bucket-name.oss-cn-hangzhou.aliyuncs.com';
    
    # $callbackUrl为上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
    $callback_url = "http://192.0.2.0:8888";
    
    # 用户上传文件时指定的前缀。
    $upload_dir = 'user-dir-prefix/'
    • $access_key_id:设置您的AccessKeyId。
    • $access_key_secret:设置您的AessKeySecret。
    • $host:格式为https://bucketname.endpoint,例如https://bucket-name.oss-cn-hangzhou.aliyuncs.com。关于Endpoint的介绍,请参见Endpoint访问域名。
    • $callback_url:设置上传回调URL,即回调服务器地址,用于处理应用服务器与OSS之间的通信。OSS会在文件上传完成后,把文件上传信息通过此回调URL发送给应用服务器。本例中修改为:$callback_url="http://192.0.2.0:1234";
    • $upload_dir:若要设置上传到OSS文件的前缀则需要配置此项,否则置空即可。

步骤2:配置客户端

  1. 下载客户端源码。
  2. 将文件解压,本示例解压至D:\aliyun\aliyun-oss-appserver-js目录。
  3. 进入该目录,打开upload.js文件,找到下面的代码语句:
    // serverUrl是用户获取签名和Policy等信息的应用服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
    serverUrl = 'http://192.0.2.0:8888'
  4. severUrl改成应用服务器的地址,客户端可以通过它获取签名直传Policy等信息。如本例中可修改为:serverUrl = 'http://192.0.2.0:1234'

步骤3:修改CORS

客户端进行表单直传到OSS时,会从浏览器向OSS发送带有Origin的请求消息。OSS对带有Origin头的请求消息会进行跨域规则(CORS)的验证。因此需要为Bucket设置跨域规则以支持Post方法。

  1. 登录OSS管理控制台。
  2. 单击Bucket列表,然后单击目标Bucket名称。
  3. 在左侧导航栏,选择数据安全 > 跨域设置。
  4. 单击创建规则,配置如下图所示。阿里云对象存储OSSRuby-云淘科技

    说明 为了您的数据安全,实际使用时,
    来源建议填写实际允许访问的域名。更多配置信息请参见
    设置跨域访问。

步骤 4:体验上传回调

  1. 启动应用服务器。


    /home/aliyun/aliyun-oss-appserver-ruby目录下,执行
    ruby appserver.rb 192.0.2.0 1234命令启动应用服务器。

    说明 请将IP和端口改成您配置的应用服务器的IP和端口。

  2. 启动客户端。

    在PC端的客户端源码目录中,打开
    index.html文件。
    阿里云对象存储OSSRuby-云淘科技

    重要 index.html文件不保证兼容IE 10以下版本浏览器,若使用IE 10以下版本浏览器出现问题时,您需要自行调试。

  3. 上传文件。

    单击
    选择文件,选择指定类型的文件后,单击
    开始上传。上传成功后,显示回调服务器返回的内容。
    阿里云对象存储OSSRuby-云淘科技

应用服务器核心代码解析

应用服务器源码包含了签名直传服务和上传回调服务两个功能。

  • 签名直传服务

    签名直传服务响应客户端发送给应用服务器的GET消息,代码片段如下:

    def get_token()
        expire_syncpoint = Time.now.to_i + $expire_time
    
        expire = Time.at(expire_syncpoint).utc.iso8601()
        response.headers['expire'] = expire
    
        policy_dict = {}
        condition_arrary = Array.new
        array_item = Array.new
        array_item.push('starts-with')
        array_item.push('$key')
        array_item.push($upload_dir)
        condition_arrary.push(array_item)
        policy_dict["conditions"] = condition_arrary
        policy_dict["expiration"] = expire
        policy = hash_to_jason(policy_dict)
        policy_encode = Base64.strict_encode64(policy).chomp;
        h = OpenSSL::HMAC.digest('sha1', $access_key_secret, policy_encode)
        hs = Digest::MD5.hexdigest(h)
        sign_result = Base64.strict_encode64(h).strip()
    
        callback_dict = {}
        callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded';
        callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}';
        callback_dict['callbackUrl'] = $callback_url;
        callback_param = hash_to_jason(callback_dict)
        base64_callback_body = Base64.strict_encode64(callback_param);
    
        token_dict = {}
        token_dict['accessid'] = $access_key_id
        token_dict['host'] = $host
        token_dict['policy'] = policy_encode
        token_dict['signature'] = sign_result 
        token_dict['expire'] = expire_syncpoint
        token_dict['dir'] = $upload_dir
        token_dict['callback'] = base64_callback_body
        response.headers["Access-Control-Allow-Methods"] = "POST"
        response.headers["Access-Control-Allow-Origin"] = "*"
        result = hash_to_jason(token_dict)
    
        result
    end
    
    get '/*' do
      puts "********************* GET "
      get_token()
    end
  • 上传回调服务

    上传回调服务响应OSS发送给应用服务器的POST消息,代码片段如下:

    post '/*' do
      puts "********************* POST"
      pub_key_url = Base64.decode64(get_header('x-oss-pub-key-url'))
      pub_key = get_public_key(pub_key_url)
      rsa = OpenSSL::PKey::RSA.new(pub_key)
    
      authorization = Base64.decode64(get_header('authorization'))
      req_body = request.body.read
      if request.query_string.empty? then
        auth_str = CGI.unescape(request.path) + "
    " + req_body
      else
        auth_str = CGI.unescape(request.path) + '?' + request.query_string + "
    " + req_body
      end
    
      valid = rsa.public_key.verify(
        OpenSSL::Digest::MD5.new, authorization, auth_str)
    
      if valid
        #body({'Status' => 'OK'}.to_json)
        body(hash_to_jason({'Status' => 'OK'}))
      else
        halt 400, "Authorization failed!"
      end
    end

    更多详情请参见API文档Callback。

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家

阿里云企业补贴进行中: 马上申请

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心。

购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠

转转请注明出处:https://www.yunxiaoer.com/158685.html

(0)
上一篇 2023年12月10日
下一篇 2023年12月10日
详情页2

相关推荐

  • 阿里云对象存储OSSBrowser.js分片上传-云淘科技

    OSS提供的分片上传(MultipartUpload)功能,将要上传的较大文件(Object)分成多个分片(Part)来分别上传,上传完成后再调用CompleteMultipartUpload接口将这些Part组合成一个Object来达到断点续传的效果。 注意事项 当您使用webpack或browserify等打包工具时,请通过npm install ali…

    阿里云对象存储 2023年12月10日
  • 阿里云云原生大数据计算服务 MaxCompute本地运行-云淘科技

    本文向您介绍本地和分布式环境运行MapReduce的差异和MapReduce本地运行示例。 各阶段介绍 本地运行前:通过在Jar命令中设置–local参数,在本地模拟MapReduce的运行过程,从而进行本地调试。 本地运行时:客户端会从MaxCompute中下载本地调试所需要的输入表的元信息、数据,所需要的资源以及输出表的元信息,并将这些信息保存到一个名为…

  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 阿里云对象存储OSSC++上传文件概述-云淘科技

    在OSS中,操作的基本数据单元是文件(Object)。OSS C++ SDK提供了丰富的文件上传方式: 简单上传:包括从内存上传和从本地上传。最大不能超过5GB。 追加上传:最大不能超过5GB。 断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。 分片上传:当文件较大时,可以使用分片上传,最大不能超过48…

    阿里云对象存储 2023年12月10日
  • 阿里云云原生大数据计算服务 MaxComputeTunnelBufferedWriter-云淘科技

    本文向您介绍TunnelBufferedWriter接口,此接口用于上传数据。 一次完整的上传流程通常包括以下步骤: 先对数据进行划分。 为每个数据块指定block Id,即调用openRecordWriter(id)。 用一个或多个线程分别将这些block上传上去,并在某个block上传失败以后,需要对整个block进行重传。 在所有block都上传以后,…

  • 阿里云大数据开发治理平台 DataWorksAnalyticDB for MySQL 3.0数据源-云淘科技

    AnalyticDB MySQL 3.0数据源为您提供读取和写入AnalyticDB MySQL 3.0双向通道的功能,本文为您介绍DataWorks的AnalyticDB for MySQL 3.0数据同步的能力支持情况。 使用限制 ADB湖仓版数据源不支持在公共资源组配置以及运行同步任务。 如果ADB数据源配置的实例从数仓版切换到了湖仓版,使用该数据源运…

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。