Full Code of rockuw/oss-in-browser for AI

master 0111db6ad7a2 cached
4 files
9.3 KB
2.5k tokens
1 requests
Download .txt
Repository: rockuw/oss-in-browser
Branch: master
Commit: 0111db6ad7a2
Files: 4
Total size: 9.3 KB

Directory structure:
gitextract_rzbxgiuq/

├── README.md
├── app.js
├── index.html
└── style.css

================================================
FILE CONTENTS
================================================

================================================
FILE: README.md
================================================
# OSS in Browser

Play with OSS right in the browser!

![Demo](screenshot.png?raw=true "OSS in Browser")

## Browser support

- IE >= 10 & Edge
- Major versions of Chrome/Firefox/Safari
- Major versions of Android/iOS/WP

## Setup

### Bucket setup

As browser-side javascript involves CORS operations. You need to setup
your bucket CORS rules to allow CORS operations:

- set allowed origins to '*'
- allowed methods to 'PUT, GET, POST, DELETE, HEAD'
- set allowed headers to '*'
- expose 'ETag' in expose headers

### STS setup

As we don't want to expose the accessKeyId/accessKeySecret in the
browser, a [common practice][oss-sts] is to use STS to grant temporary
access.

### App setup

Fill in your appServer address and bucket name in `app.js`:

```js
var appServer = '<your STS app server>';
var bucket = '<your bucket name>';
var region = 'oss-cn-hangzhou';
```

And then open `index.html` in your browser.

### STS App server

A sample app server can be found [here][node-sts-app-server].

### IE Compatibility

You may need include the promise polyfill for IE:

```html
<script src="https://www.promisejs.org/polyfills/promise-6.1.0.js"></script>
```


[node-sts-app-server]: https://github.com/rockuw/node-sts-app-server
[oss-sts]: https://help.aliyun.com/document_detail/oss/practice/ram_guide.html


================================================
FILE: app.js
================================================
'use strict';

var appServer = 'http://localhost:3000';
var bucket = '<bucket-name>';
var region = 'oss-cn-hangzhou';

var urllib = OSS.urllib;
var Buffer = OSS.Buffer;
var OSS = OSS.Wrapper;
var STS = OSS.STS;

// Play without STS. NOT SAFE! Because access key id/secret are
// exposed in web page.

// var client = new OSS({
//   region: 'oss-cn-hangzhou',
//   accessKeyId: '<access-key-id>',
//   accessKeySecret: '<access-key-secret>',
//   bucket: '<bucket-name>'
// });
//
// var applyTokenDo = function (func) {
//   return func(client);
// };

var applyTokenDo = function (func) {
  var url = appServer;
  return urllib.request(url, {
    method: 'GET'
  }).then(function (result) {
    var creds = JSON.parse(result.data);
    var client = new OSS({
      region: region,
      accessKeyId: creds.AccessKeyId,
      accessKeySecret: creds.AccessKeySecret,
      stsToken: creds.SecurityToken,
      bucket: bucket
    });

    return func(client);
  });
};

var progress = function (p) {
  return function (done) {
    var bar = document.getElementById('progress-bar');
    bar.style.width = Math.floor(p * 100) + '%';
    bar.innerHTML = Math.floor(p * 100) + '%';
    done();
  }
};

var uploadFile = function (client) {
  var file = document.getElementById('file').files[0];
  var key = document.getElementById('object-key-file').value.trim() || 'object';
  console.log(file.name + ' => ' + key);

  return client.multipartUpload(key, file, {
    progress: progress
  }).then(function (res) {
    console.log('upload success: %j', res);
    return listFiles(client);
  });
};

var uploadContent = function (client) {
  var content = document.getElementById('file-content').value.trim();
  var key = document.getElementById('object-key-content').value.trim() || 'object';
  console.log('content => ' + key);

  return client.put(key, new Buffer(content)).then(function (res) {
    return listFiles(client);
  });
};

var listFiles = function (client) {
  var table = document.getElementById('list-files-table');
  console.log('list files');

  return client.list({
    'max-keys': 100
  }).then(function (result) {
    var objects = result.objects.sort(function (a, b) {
      var ta = new Date(a.lastModified);
      var tb = new Date(b.lastModified);
      if (ta > tb) return -1;
      if (ta < tb) return 1;
      return 0;
    });

    var numRows = table.rows.length;
    for (var i = 1; i < numRows; i ++) {
      table.deleteRow(table.rows.length - 1);
    }

    for (var i = 0; i < Math.min(3, objects.length); i ++) {
      var row = table.insertRow(table.rows.length);
      row.insertCell(0).innerHTML = objects[i].name;
      row.insertCell(1).innerHTML = objects[i].size;
      row.insertCell(2).innerHTML = objects[i].lastModified;
    }
  });
};

var downloadFile = function (client) {
  var object = document.getElementById('dl-object-key').value.trim();
  var filename = document.getElementById('dl-file-name').value.trim();
  console.log(object + ' => ' + filename);

  var result = client.signatureUrl(object, {
    response: {
      'content-disposition': 'attachment; filename="' + filename + '"'
    }
  });
  window.location = result;

  return result;
};

window.onload = function () {
  document.getElementById('file-button').onclick = function () {
    applyTokenDo(uploadFile);
  }

  document.getElementById('content-button').onclick = function () {
    applyTokenDo(uploadContent);
  }

  document.getElementById('list-files-button').onclick = function () {
    applyTokenDo(listFiles);
  }

  document.getElementById('dl-button').onclick = function () {
    applyTokenDo(downloadFile);
  }

  applyTokenDo(listFiles);
};


================================================
FILE: index.html
================================================
<!DOCTYPE html>
<html>
<head>
  <title>OSS in Browser</title>
  <script src="https://www.promisejs.org/polyfills/promise-6.1.0.js"></script>
  <script type="text/javascript" src="http://gosspublic.alicdn.com/aliyun-oss-sdk.min.js"></script>
  <script type="text/javascript" src="app.js"></script>
  <link rel="stylesheet" href="bootstrap.min.css" />
  <link rel="stylesheet" href="style.css" />
</head>
<body>
  <div id="main">
    <div class="page-header">
      <h1>OSS <small>in</small> Browser</h1>
    </div>
    <table>
      <tr>
        <td>
          <div class="panel panel-primary">
            <div class="panel-heading">Upload file</div>
            <div class="panel-body">
              <form action="" class="form-horizontal">
                <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>
              </form>
              <br />
              <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>
          </div>
        </td>
        <td>
          <div class="panel panel-success">
            <div class="panel-heading">Upload content</div>
            <div class="panel-body">
              <form action="" class="form-horizontal">
                <div class="form-group">
                  <label>Content</label>
                  <textarea class="form-control" id="file-content" rows="3">Hello, OSS!</textarea>
                </div>
                <div class="form-group">
                  <label>Store as</label>
                  <input type="text" class="form-control" id="object-key-content" value="object" />
                </div>
                <div class="form-group">
                  <input type="button" class="btn btn-primary" id="content-button" value="Save" />
                </div>
              </form>
            </div>
          </div>
        </td>
      </tr>
      <tr>
        <td>
          <div class="panel panel-info">
            <div class="panel-heading">List files</div>
            <div class="panel-body">
              <table class="table table-striped" id="list-files-table">
                <tr>
                  <th>Key</th>
                  <th>Size</th>
                  <th>LastModified</th>
                </tr>
              </table>
              <input type="button" class="btn btn-primary" id="list-files-button" value="Refresh" />
            </div>
          </div>
        </td>
        <td>
          <div class="panel panel-warning">
            <div class="panel-heading">Download file</div>
            <div class="panel-body">
              <form action="" class="form-horizontal">
                <div class="form-group">
                  <label>Object key</label>
                  <input type="text" class="form-control" id="dl-object-key" value="object" />
                </div>
                <div class="form-group">
                  <label>Save as</label>
                  <input type="text" class="form-control" id="dl-file-name" value="filename" />
                </div>
                <div class="form-group">
                  <input type="button" class="btn btn-primary" id="dl-button" value="Download" />
                </div>
              </form>
            </div>
          </div>
        </td>
      </tr>
      <tr>
        <td colspan="2">
          Powered by
          <a href="https://www.aliyun.com/product/oss">OSS</a> &
          <a href="https://github.com/ali-sdk/ali-oss">ali-oss</a></td>
      </tr>
    </table>
  </div>
</body>
</html>


================================================
FILE: style.css
================================================
body {
    text-align: center;
}

#main {
    text-align: left;
    width: 1000px;
    margin: 0 auto;
}

table tr td > div {
    width: 480px;
    height: 300px;
    margin: 10px;
}

table tr td > div > div.panel-body {
    margin-left: 5px;
    margin-right: 5px;
}
Download .txt
gitextract_rzbxgiuq/

├── README.md
├── app.js
├── index.html
└── style.css
Condensed preview — 4 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (10K chars).
[
  {
    "path": "README.md",
    "chars": 1312,
    "preview": "# OSS in Browser\n\nPlay with OSS right in the browser!\n\n![Demo](screenshot.png?raw=true \"OSS in Browser\")\n\n## Browser sup"
  },
  {
    "path": "app.js",
    "chars": 3665,
    "preview": "'use strict';\n\nvar appServer = 'http://localhost:3000';\nvar bucket = '<bucket-name>';\nvar region = 'oss-cn-hangzhou';\n\nv"
  },
  {
    "path": "index.html",
    "chars": 4245,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n  <title>OSS in Browser</title>\n  <script src=\"https://www.promisejs.org/polyfills/promise"
  },
  {
    "path": "style.css",
    "chars": 268,
    "preview": "body {\n    text-align: center;\n}\n\n#main {\n    text-align: left;\n    width: 1000px;\n    margin: 0 auto;\n}\n\ntable tr td > "
  }
]

About this extraction

This page contains the full source code of the rockuw/oss-in-browser GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 4 files (9.3 KB), approximately 2.5k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!