微信小程序上傳文件小結

前言

後端用的是Rails ActiveStorage direct_upload的處理方式, 前端被要求:html

  1. 提供文件的MD5-Base64校驗值,得到上傳地址;
  2. 將文件上傳到上述指定地址(此處會校驗文件的MD5-Base64值是否與上一步給的一致);
  3. 將文件的signed_id做爲文件參數。

相關知識

由於目前開發任務重且緊,暫時略過此部分,只記錄結論要點,後續有時間再補充相關知識前端

要點小結

3.0 上傳文件(後端 Rails: activeStorage)

Step 1: 計算文件MD5-Base64 Encoded摘要

  1. 小程序中前端沒法獲取文件的Binary格式,所以沒法自行或使用第三方庫來計算文件的MD5值,但幸運的是,小程序也提供了API來作這件事,請使用:wx.getFileInfo
  2. 將得到的MD5值轉爲Base64格式。此處嚴重注意,不能把MD5看成字符串去編碼爲Base64格式,而應該編碼爲Hex,再編碼爲Base64。可以使用CryptoJS庫,另外須要注意的是,CryptoJS.enc.Base64.stringify須要的參數是WordArray格式,而經過CryptoJS.enc.Hex.parse轉換後的正好是其所須要的參數格式。
  3. 此步驟問題見此處

Step 2: 上傳文件到上一步返回的指定direct_upload地址

  1. 小程序前端沒法直接得到文件的Binary格式傳給後端,但能夠經過wx.uploadFile上傳文件,經過此接口發送請求,後端可獲取到文件Binary格式
  2. 若小程序端使用wx.uploadFile上傳文件,後端提供的上傳文件接口需符合wx.uploadFile的要求,即請求方式爲POST, 並指定所需文件key名(而不是直接要求把Binary文件丟在請求body中)
  3. 因爲後端表示使用的是第三方亞馬遜的服務,沒法修改接口,所以,小程序端要尋找其餘方式獲取文件Binary上傳,所幸在小程序提供的文件管理器中找到方法能夠獲取文件Binary, 方法爲FileSystemManager.readFile(Object), API文檔點擊此處查看
  4. 使用FileSystemManager.readFile(Object)的時候,不要指定encoding, 以默認ArrayBuffer的格式獲取文件內容,這樣服務器那邊拿到文件算出的Base64 Encoded MD5才能與前端傳過去的一致。若指定encoding爲binary,則接口返回結果表示:接收到的文件計算出的Base64 Encoded MD5與前端這邊所發送的不一致,校驗不經過。看起來服務端那邊要的文件格式,是ArrayBuffer格式,而非binary編碼的文件。
相關文章
相關標籤/搜索