阿里雲團隊努力不懈,力求將最新的技術內容更快地以您最熟悉的語言呈現。本文由簡體中文內容自動轉碼而成,過程無人工干預。阿里雲不保證此自動轉碼的準確性、完整性及時效性。因轉碼造成的任何內容錯誤及因此可能帶來的損失,阿里雲概不負責,敬請見諒。本文内容請以簡體中文版本為準。
全部產品
Search
文件中心

瀏覽器應用

更新時間: Oct 30, 2018

瀏覽器支援

  • 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規則的第一條。

cors

STS設定

為了不在網頁中暴露AccessKeyId和AccessKeySecret,我們採用STS進行臨時授權。授權伺服器由使用者維護,只有認證的使用者才能向授權伺服器申請臨時許可權。設定子帳號和STS的Policy,參考Node.js STS AppServer搭建自己的授權伺服器。

例子

下面我們將使用SDK開發一個網頁應用,包含4個功能:

  • 上傳檔案
  • 上傳文本
  • 列出檔案
  • 下載檔案

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

下面的介紹將以“上傳檔案”為例:

1. 建立網頁

對於“上傳檔案”的功能,在網頁上需要4個控制項:

  • 一個檔案選擇框,用於選擇需要上傳的檔案
  • 一個文字框,用於輸入上傳到OSS的Object名字
  • 一個按鈕,用於開始上傳
  • 一個進度條,用於顯示上傳的進度

下面的代碼建立了這4個控制項,其中class="xxx"是為了使用Bootstrap樣式,可以先忽略。

  1. <div class="form-group">
  2. <label>Select file</label>
  3. <input type="file" id="file" />
  4. </div>
  5. <div class="form-group">
  6. <label>Store as</label>
  7. <input type="text" class="form-control" id="object-key-file" value="object" />
  8. </div>
  9. <div class="form-group">
  10. <input type="button" class="btn btn-primary" id="file-button" value="Upload" />
  11. </div>
  12. <div class="form-group">
  13. <div class="progress">
  14. <div id="progress-bar"
  15. class="progress-bar"
  16. role="progressbar"
  17. aria-valuenow="0"
  18. aria-valuemin="0"
  19. aria-valuemax="100" style="min-width: 2em;">
  20. 0%
  21. </div>
  22. </div>
  23. </div>

2. 添加樣式

接下來為網頁添加一些樣式,讓它更好看一些,這裡我們用到了Bootstrap。在網頁的<head>標籤中加入樣式:

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

其中bootstrap.min.css可以在bootstrap的官網下載。

3. 添加指令碼或直譯式程式

到目前為止,網頁是靜態,點擊上面的按鈕也不會有反應。接下來的重點是為它添加一些JavaScript指令碼或直譯式程式,讓它能夠上傳檔案/下載檔案/列出檔案。

首先在<head>標籤中引入SDK的開發包:

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

其中app.js是真正執行上傳檔案的代碼,內容如下:

  1. const appServer = 'http://localhost:3000';
  2. const bucket = 'js-sdk-bucket-sts';
  3. const region = 'oss-cn-hangzhou';
  4. const urllib = OSS.urllib;
  5. const applyTokenDo = function (func) {
  6. const url = appServer;
  7. return urllib.request(url, {
  8. method: 'GET'
  9. }).then(function (result) {
  10. const creds = JSON.parse(result.data);
  11. const client = new OSS({
  12. region: region,
  13. accessKeyId: creds.AccessKeyId,
  14. accessKeySecret: creds.AccessKeySecret,
  15. stsToken: creds.SecurityToken,
  16. bucket: bucket
  17. });
  18. return func(client);
  19. });
  20. };
  21. let currentCheckpoint;
  22. const progress = async function progress(p, checkpoint) {
  23. currentCheckpoint = checkpoint;
  24. const bar = document.getElementById('progress-bar');
  25. bar.style.width = `${Math.floor(p * 100)}%`;
  26. bar.innerHTML = `${Math.floor(p * 100)}%`;
  27. };
  28. let uploadFileClient;
  29. const uploadFile = function (client) {
  30. if (!uploadFileClient || Object.keys(uploadFileClient).length === 0) {
  31. uploadFileClient = client;
  32. }
  33. const file = document.getElementById('file').files[0];
  34. const key = document.getElementById('object-key-file').value.trim() || 'object';
  35. console.log(`${file.name} => ${key}`);
  36. const options = {
  37. progress,
  38. partSize: 100 * 1024,
  39. meta: {
  40. year: 2017,
  41. people: 'test',
  42. },
  43. };
  44. return client.multipartUpload(key, file, options).then( (res) => {
  45. console.log('upload success: %j', res);
  46. currentCheckpoint = null;
  47. uploadFileClient = null;
  48. }).catch((err) => {
  49. if (uploadFileClient && uploadFileClient.isCancel()) {
  50. console.log('stop-upload!');
  51. } else {
  52. console.error(err);
  53. }
  54. });
  55. };
  56. window.onload = function () {
  57. document.getElementById('file-button').onclick = function () {
  58. applyTokenDo(uploadFile);
  59. }
  60. };

上傳一個檔案分為以下步驟:

  1. 向授權伺服器申請臨時許可權。其中授權伺服器是網站開發人員構建的用於向終端使用者提供臨時授權的服務。開發人員可以在授權時為不同的使用者提供不同的許可權(參考OSS使用STS)。授權伺服器可以參考這個例子,為了簡便,例子中授權伺服器直接向使用者返回臨時憑證。
  2. 使用臨時密鑰建立OSS Client。
  3. 通過multipartUpload上傳選中的檔案,並通過progress參數設定進度條。

4. 其他功能

上傳常值內容、獲取檔案清單、下載檔案等功能請參考程式碼範例:OSS in Browser