一、需求背景
2020年9月份左右,公司需要開發一個資料管理系統,存儲內部及行業資料。資料類型包括視頻、Office文檔、圖片、PDF、資料壓縮包。考慮到所有文件都能在線預覽、文件加密、上傳、下載等需求,故采用了阿里雲OSS對象存儲。
二、解決方案簡介
文件加密采用sign加密讀取,具有時效性。視頻等大型文件上傳,使用分片上傳,也可斷點續傳。資料壓縮包中存在多個文件,使用OSS的數據處理ZIP包解壓,通過配置,自動解壓符合條件的zip包。文件預覽采用OSS的IMM預覽,可直接在瀏覽器打開Office文檔。
三、解決方案詳細
建議開發者在對接OSS產品之前,可先自己開一個阿里雲賬號進行對接測試,這樣就不會影響公司目前正在運行的業務。在對接過程中,有相關問題無法解決時,可通過平台提交工單,協助解決問題。
1、文件加密,首先在OSS創建的backet,需要為“私有”,設置為私有后,上傳文件需要設置headers。
// 上傳時可以設置相關的headers,例如設置訪問權限為private和自定義元信息。
$options = array(
OssClient::OSS_HEADERS => array(
'x-oss-object-acl' => 'private',
),
);
設置后,該文件訪問需要sign簽名,過期時間可設置。
2、壓縮包自動解壓,並列舉子文件
1)、在阿里雲平台配置ZIP包解壓
前綴:文件名前綴符合條件時,如zip_aa.zip,則會觸發條件,自動解壓。
目標目錄:並將文件解壓到unzip目錄下。
2)、文件上傳成功后,調用listObjects得到該解壓文件夾的所有文件
列舉文件 - 對象存儲 OSS:https://help.aliyun.com/document_detail/88510.html
3、Office文檔(doc、xls、ppt)的預覽
Office文檔預覽有兩種方式,第一種通過Microsoft提供的預覽服務,
https://view.officeapps.live.com/op/view.aspx?src=路徑, 第二種通過OSS的IMM預覽。
第一種和第二種的區別是,第一種更加清晰,並免費,但穩定性不如IMM(國外服務)。建議兩種方式都兼容,如果第一種無法使用,則可以快速切換到第二種。
在backet左側菜單的數據處理->智能媒體開啟IMM預覽。
4、大型文件上傳,建議使用客戶端直傳(獲取臨時上傳憑證后,進行上傳)方式,支持Vue。以下簡述vue-simple-uploader + php實現阿里雲OSS分片上傳。
1)、配置好simple-uploader相關參數(每片上傳大小、並發上傳數、上傳地址),並配置好上傳成功回調函數、文件添加回調函數。
2)、通過simple-uploader傳遞的identifier(上傳唯一識別碼)、chunkNumber(當前上傳的第幾片)、totalChunks(總片數),對這些數據在PHP進行處理。
3)、在PHP中,chunkNumber=1時,則是第一片,需要初始分片任務,並上傳分片。初始化后,會得到OSS的object(文件路徑)與uploadID(分片任務標識ID),將這兩個值通過redis存儲,以identifier為主鍵。
4)、chunkNumber!=1且不等於最后一片時,則上傳片,上傳片之前,通過identifier得到之前的uploadID。
5)、chunkNumber等於最后一片時,則合並片完成上傳,返回object至前端,銷毀redis存儲的臨時內容。
開發對接中遇到問題,歡迎聯系作者,謝謝!