天天看點

OSS直傳與UXCore-Uploader實踐背景OSS的接入方式選擇使用UXCore-Uploader直傳遇到問題解決方案小結Reference

本文是我們OSS的使用者自己寫的一篇文章,筆者做了簡單的修改。這裡代發。感謝這位使用者對OSS的了解如此深!

背景

視聯網業務中,需要存儲大量的圖檔、視訊等素材資源,為應對這種大資料檔案的存儲,就接入了

阿裡雲對象存儲服務

(Object Storage Service,簡稱 OSS)。

OSS的接入方式選擇

WEB端直傳

很多人采用的做法是使用者在浏覽器/APP上傳到應用伺服器,然後應用伺服器再把檔案上傳到OSS。

OSS直傳與UXCore-Uploader實踐背景OSS的接入方式選擇使用UXCore-Uploader直傳遇到問題解決方案小結Reference

該方法有如下缺點:

  • 上傳慢
    • 先上傳到應用伺服器,再上傳到OSS,網絡傳送多了一倍。
    • 如果資料直傳到OSS,不走應用伺服器,速度将大大提升,而且OSS是采用BGP帶寬,能保證各地各營運商的速度。
  • 擴充性不好
    • 如果後續使用者多了,應用伺服器會成為瓶頸。
  • 費用高
    • 由于OSS上傳流量是免費的。如果資料直傳到OSS,不走應用伺服器,那麼将能省下幾台應用伺服器。

服務端簽名後直傳

OSS直傳與UXCore-Uploader實踐背景OSS的接入方式選擇使用UXCore-Uploader直傳遇到問題解決方案小結Reference

相比上面這種WEB端直傳方式,服務端簽名直傳的方式能夠更好的解決相關痛點,符合業務需求。

使用UXCore-Uploader直傳

UXCore-Uploader特性

  • md5(用于秒傳)
  • 分片上傳
  • html5-runtime,flash-runtime
  • 多種收集器
    • DndCollector
    • PasteCollector
    • PickerCollector
  • 擁抱es6

擷取後端伺服器簽名

第一步,就是擷取簽名,這裡封裝成了一個方法。

getPolicy() {
  fetch('後端簽名認證資訊URL').then(res => {
    this.url = res.host;
    this.params = {
      signature: res.signature,
      expire: res.expire,
      OSSAccessKeyId: res.accessKeyId,
      policy: res.policy,
      dir: res.pictureDir,
      success_action_status: '200',
      'content-disposition': 'attachement'
    };
  });
}           

OSS的簽名參數,請參考

服務端簽名PostObject

UXCore-Uploader配置

因為項目中要求是視訊和圖檔,是以需要對Uploader進行accept屬性的配置,不然會導緻上傳失敗,并把之前getPolicy中擷取的資料進行傳入。

<Uploader
 accept="avi,asf,wmv,mpeg,mpg,vob,mkv,mov,rmvb,mp4,bmp,jpg,gif,jpeg,png"
  // 其他項省略...
  url={this.url}
  params={this.params}
>           

感覺一切OK,應該可以用了,但是問題出現了。

遇到問題

由于UXCore-Uploader配合fileList參數,需要對Response的資料有一個要求格式:

{
    name: '', // 檔案名稱,清單形式必填
    ext: '', // 檔案擴充名。例如 jpg。可選,不填時無法根據類型展示對應圖示
    fileType: '', // 檔案 mimetypes 類型。 例如 image/jpg。 可選,不填時無法根據類型展示對應圖示
    response: {
      url: xxx,  // 檔案連結,必填
      canRemove: true, // 是否可以删除,可選
      downloadUrl: 'xxxx', // 下載下傳 URL,可選
    },
  }           

而OSS傳回的資料預設并沒有response字段,是以報錯了。

OSS直傳與UXCore-Uploader實踐背景OSS的接入方式選擇使用UXCore-Uploader直傳遇到問題解決方案小結Reference
OSS直傳與UXCore-Uploader實踐背景OSS的接入方式選擇使用UXCore-Uploader直傳遇到問題解決方案小結Reference

解決方案

檢視了UXCore-Uploader的源碼,發現是基于UploadCore庫做的封裝,其中有一個鈎子onfileuploadcompleting,可以實作對response字段的定制。

onfileuploadcompleting(FileResponse) {
  FileResponse.setResponse({
    content: {
      url: '',
      downloadUrl: '',
    },
    success: true,
  });
}           

UploadCore詳細說明請參考

UploadCore

UploadCore中提供了onfileuploadpreparing,getPolicy可以放到這個地方執行。

onfileuploadpreparing: request => {
  fetch('後端簽名認證資訊URL').then(res => {
    request.setUrl(res.host);
    request.setParam('OSSAccessKeyId', res.accessKeyId);
    // 省略其他配置項...
   });
 }
}           

上傳完成後的相關資訊,也需要在onfileuploadcompleted中去擷取。

小結

本文簡單描述了使用UXCore-Uploader進行OSS直傳碰到的問題及解決辦法。UXCore-Uploader的特性,可以成為一種更好的OSS直傳選擇。

Reference

繼續閱讀