本文主要介绍浏览器的应用。

浏览器低支持

  • IE(>=10)和Edge
  • 主流版本的Chrome/Firefox/Safari
  • 主流版本的Android/iOS/WindowsPhone
注意 在IE中使用需要在引入SDK之前引入promise库。

浏览器低版本支持

SDK是通过File API进行文件操作,在一些较低版本的浏览器运行会出现问题。可以利用一些第三方的上传插件,通过对OSS API的实现,实现OSS的上传、下载等操作。具体范例请参见Web端直传实践

  • 设置
    • Bucket设置

      从浏览器中直接访问OSS,需要对Bucket的CORS属性进行设置,设置方式如下所示:

      • 来源设置成 *
      • Method设置成 GET, POST, PUT, DELETE, HEAD
      • Allowed Header设置成 *
      • Expose Header设置成 etag
      注意 请将该条CORS规则设置成所有CORS规则的第一条。


    • STS设置

      为了不在网页中暴露AccessKeyId和AccessKeySecret,我们采用STS进行临时授 权。授权服务器由用户维护,只有认证的用户才能向授权服务器申请临时权限。设置子账号和STS的Policy,参考Node.js STS AppServer搭建自己的授权服务器。

  • 示例

    下面我们将使用SDK开发一个网页应用,包含4个功能:

    • 上传文件
    • 上传文本
    • 列出文件
    • 下载文件

    完整的代码可以在oss-in-browser找到。最终的效果如下:

    下面的介绍将以“上传文件”为例:

    1. 创建网页
      • 一个文件选择框,用于选择需要上传的文件
      • 一个文本框,用于输入上传到OSS的Object名字
      • 一个按钮,用于开始上传
      • 一个进度条,用于显示上传的进度

      下面的代码创建了这4个控件,其中class="xxx"是为了使用Bootstrap样 式,可以先忽略。

      <div class="form-group">
        <label>Select file</label>
        <input type="file" id="file" />
      </div>
      <div class="form-group">
        <label>Store as</label>
        <input type="text" class="form-control" id="object-key-file" value="object" />
      </div>
      <div class="form-group">
        <input type="button" class="btn btn-primary" id="file-button" value="Upload" />
      </div>
      <div class="form-group">
        <div class="progress">
          <div id="progress-bar"
               class="progress-bar"
               role="progressbar"
               aria-valuenow="0"
               aria-valuemin="0"
               aria-valuemax="100" style="min-width: 2em;">
            0%
          </div>
        </div>
      </div>
      
    2. 添加样式

      接下来为网页添加一些样式,让它更好看一些,这里我们用到了Bootstrap。 在网页的<head>标签中加入样式:

      <head>
        <title>OSS in Browser</title>
        <link rel="stylesheet" href="bootstrap.min.css" />
      </head>
      

      其中bootstrap.min.css可以在bootstrap的官网下载。

    3. 添加脚本

      到目前为止,网页是静态的,点击上面的按钮也不会有反应。接下来的重点是为它添 加一些JavaScript脚本,让它能够上传文件/下载文件/列出文件。

      首先在<head>标签中引入SDK的开发包:

      <head>
        <title>OSS in Browser</title>
        <link rel="stylesheet" href="bootstrap.min.css" />
        <script type="text/javascript" src="http://gosspublic.alicdn.com/aliyun-oss-sdk-x.x.x.min.js"></script>
        <script type="text/javascript" src="app.js"></script>
      </head>
      

      其中app.js是真正执行上传文件的代码,内容如下:

      const appServer = 'http://localhost:3000';
      const bucket = 'js-sdk-bucket-sts';
      const region = 'oss-cn-hangzhou';
      
      const urllib = OSS.urllib;
      
      const applyTokenDo = function (func) {
        const url = appServer;
        return urllib.request(url, {
          method: 'GET'
        }).then(function (result) {
          const creds = JSON.parse(result.data);
          const client = new OSS({
            region: region,
            accessKeyId: creds.AccessKeyId,
            accessKeySecret: creds.AccessKeySecret,
            stsToken: creds.SecurityToken,
            bucket: bucket
          });
      
          return func(client);
        });
      };
      
      let currentCheckpoint;
      const progress = async function progress(p, checkpoint) {
        currentCheckpoint = checkpoint;
        const bar = document.getElementById('progress-bar');
        bar.style.width = `${Math.floor(p * 100)}%`;
        bar.innerHTML = `${Math.floor(p * 100)}%`;
      };
      
      let uploadFileClient;
      const uploadFile = function (client) {
        if (!uploadFileClient || Object.keys(uploadFileClient).length === 0) {
          uploadFileClient = client;
        }
        
        const file = document.getElementById('file').files[0];
        const key = document.getElementById('object-key-file').value.trim() || 'object';
        console.log(`${file.name} => ${key}`);
      
        const options = {
          progress,
          partSize: 100 * 1024,
          meta: {
            year: 2017,
            people: 'test',
          },
        };
      
        return client.multipartUpload(key, file, options).then( (res) => {
          console.log('upload success: %j', res);
      	currentCheckpoint = null;
          uploadFileClient = null;
        }).catch((err) => {
          if (uploadFileClient && uploadFileClient.isCancel()) {
            console.log('stop-upload!');
          } else {
            console.error(err);
          }
        });
      };
      
      window.onload = function () {
        document.getElementById('file-button').onclick = function () {
          applyTokenDo(uploadFile);
        }
      };
      

      上传一个文件分为以下步骤:

      1. 向授权服务器申请临时权限。其中授权服务器是网站开发者构建的用于向终端用户提供临时授权的服务。开发者可以在授权时为不同的用户提供不同的权限(参考OSS使用STS)。授权服务器可以参考这个例子,为了简便,例子中授权服务器直接向用户返回临时凭证。
      2. 使用临时密钥创建OSS Client。
      3. 通过multipartUpload上传选中的文件,并通过progress参数设置进度条。
      4. 其他功能

        上传文本内容、获取文件列表、下载文件等功能请参考代码示例:OSS in Browser