摘要:和數據直傳到相比,以上方法有三個缺點上傳慢。端向服務端請求簽名,然后直接上傳,不會對服務端產生壓力,而且安全可靠。規定返回數據的格式,當前默認返回圖片信息寬度高度,可獲取更多數據。
背景
每個OSS的用戶都會用到上傳服務。Web端常見的上傳方法是用戶在瀏覽器或app端上傳文件到應用服務器,然后應用服務器再把文件上傳到OSS。
和數據直傳到OSS相比,以上方法有三個缺點:
上傳慢。先上傳到應用服務器,再上傳到OSS,網絡傳送比直傳到OSS多了一倍。如果直傳到OSS,不通過應用服務器,速度將大大提升,而且OSS采用BGP帶寬,能保證各地各運營商的速度。
擴展性差。如果后續用戶多了,應用服務器會成為瓶頸。
費用高。需要準備多臺應用服務器。由于OSS上傳流量是免費的,如果數據直傳到OSS,不通過應用服務器,那么將能省下幾臺應用服務器。
目的 Android、IOS端直傳實踐Web端直傳共有三種方式:
JavaScript客戶端簽名直傳講解在客戶端通過JavaScript代碼完成簽名,然后通過表單直傳數據到OSS。
服務端簽名后直傳講解在服務端通過PHP代碼完成簽名,然后通過表單直傳數據到OSS。
服務端簽名直傳并設置上傳回調講解在服務端通過PHP代碼完成簽名,并且服務端設置了上傳后回調,然后通過表單直傳數據到OSS。OSS回調完成后,應用服務器再返回結果給客戶端。
在客戶端通過JavaScript代碼完成簽名,無需過多配置,即可實現直傳,非常方便。但是客戶端通過JavaScript把AccesssKeyID 和AccessKeySecret寫在代碼里面有泄露的風險。
web端向服務端請求簽名,然后直接上傳,不會對服務端產生壓力,而且安全可靠。然而有個問題,就是用戶上傳了多少文件,上傳了什么文件,服務端并不能馬上知道,如果想實時了解用戶上傳了什么文件,可以采用第三種方式。
本文將演示如何通過第三種方式完成文件直傳到OSS服務器。
demo 前端window.onload = function () { let upload = document.getElementById("upload") let link = document.getElementById("link") let obj = {} // 獲取簽名地址 // const url = "http://gt-activity.gtdreamlife.com/api/oss/ossSign" axios.get(url).then(res => { if (res.data.statusCode === 200) { // 下面是簽名直傳服務返回給客戶端的消息body內容的示例,這個body的內容將作為客戶端上傳文件的重要參數。 let { dirPath, key, host, policy, Signature, callback, OSSAccessKeyId } = res.data.result obj.host = host obj.key = dirPath + key + "${filename}" obj.policy = policy obj.Signature = Signature obj.callback = callback obj.OSSAccessKeyId = OSSAccessKeyId console.log(obj) } else { alert(res.data.message) } }) document.querySelector("#file").onchange = function (e) { let data = e.target.files[0] console.log(data) let formData = new FormData() for (let key in obj) { formData.append(key, obj[key]) } // append 文件必須放在最后,不然會報key錯誤 formData.append("file", data) axios.post(obj.host, formData).then(res => { const result = res.data document.querySelector("#link").value = result.data }) } }服務端
阿里云OSS配置信息
const config = { dirPath: "oss/file/", // oss 文件夾 不存在會自動創建 bucket: "${bucket}", // oss應用名 region: "${region}", // oss節點名 accessKeyId: "${accessKeyId}", // 申請的osskey accessKeySecret: "${accessKeySecret}", // 申請的osssecret callbackPath: "api/oss/ossCallback", // 回調接口 expAfter: 6000, // 簽名失效時間 maxSize: 1048576000, // 最大文件大小 };
獲取簽名接口
服務器返回數據Callback API
// 圖片簽名 async ossSign() { const { bucket, region, expAfter, maxSize, dirPath, accessKeyId, accessKeySecret, callbackPath, } = config; const host = `https://${bucket}.${region}.aliyuncs.com`; // 你的oss完整地址 // 回調接口的主機和端口 const { callbackHost, callbackPort } = this.app.config.oss; const expireTime = new Date().getTime() + expAfter; const expiration = new Date(expireTime).toISOString(); const policyString = JSON.stringify({ expiration, conditions: [ [ "content-length-range", 0, maxSize ], [ "starts-with", "$key", dirPath ], ], }); const policy = Buffer(policyString).toString("base64"); // 創建簽名 const Signature = crypto.createHmac("sha1", accessKeySecret).update(policy).digest("base64"); const callbackBody = { // callbackUrl為 上傳回調服務器的URL,請將下面的IP和Port配置為您自己的真實信息。 callbackUrl: `https://${callbackHost}${callbackPort ? `:${callbackPort}` : ""}/${callbackPath}`, callbackHost: `${callbackHost}`, // 規定返回數據的格式,當前默認返回圖片信息、寬度、高度,可獲取更多數據。參考上方鏈接 callbackBody: "{"filename": ${object},"size": ${size},"width": ${imageInfo.width},"height": ${imageInfo.height}}", callbackBodyType: "application/json", }; const callback = Buffer(JSON.stringify(callbackBody)).toString("base64"); this.ctx.body = ({ statusCode: 200, message: "oss簽名成功", result: { Signature, // 對變量policy簽名后的字符串。 policy, // 用戶表單上傳的策略(Policy),是經過base64編碼過的字符串。 host, // 用戶要往哪個域名發送上傳請求。 OSSAccessKeyId: accessKeyId, // 用戶請求的accessid。 key: expireTime, // 唯一標識,添加到上傳的文件名中防止重復 success_action_status: 200, dirPath, // 文件上傳地址 callback, // 接口回調 }, }); }
請求回調接口
// 回調 async ossCallback() { const { body = {} } = this.ctx.request; // 對應簽名接口中定義的返回數據字段 const { filename, height, width } = body; if (filename) { this.ctx.body = ({ status: 200, message: "操作成功", data: `https://${config.bucket}.${config.region}.aliyuncs.com/${filename}#w=${width}#h=${height}`, }); } else { this.ctx.body = { status: 500, message: "操作失敗", data: null, }; } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99025.html
摘要:我們通過這個去解決該文章主要介紹如何獲取和這兩個參數首先下載直傳的案例解壓后打開里面的完成后就可以用瀏覽器打開按下點到選項,效果如圖我們隨便選擇一個圖片上傳然后配合來解決圖片上傳 我們通過aliyun-oss-web這個npm去解決 該文章主要介紹如何獲取 imgSignature 和 imgPolicy 這兩個參數 首先下載 web直傳的案例 : http://files.cnblo...
摘要:一準備工作開通阿里云服務,從控制臺上獲取和。參考資料阿里云官方文檔開始使用阿里云官方文檔介紹如何在中快速使用訪問服務微信公眾號圖片上傳至阿里云前端圖片直傳試驗如何基于和,快速搭建音視頻文件上傳服務聲明轉發請注明出處,謝謝 一、準備工作 1. 開通阿里云OSS服務,從控制臺上獲取AccessKeyId和AccessKeySecret。 2. 創建Bucket,并登錄OSS控制臺 3. 配...
摘要:前言為了減輕服務器壓力,采用直傳的方式,直接把資源圖片,文件,視頻等上傳到阿里云服務器。這個是需要觸發這個回調來通知服務器操作結果。服務器端同事調的,通過接口返回給前端的。這個就是簽名,最關鍵的。的的使用如下結束這樣就搞定了。 前言: 為了減輕服務器壓力,采用web直傳的方式,直接把資源(圖片,文件,視頻等)上傳到阿里云oss服務器。但是阿里只提供 plupload.js 環境下的 d...
摘要:當時的方案是前端先調用微信的選擇圖片并上傳,然后再從后端下載到服務器上。如果其值未設置或者設置成一個非法值,返回一個空文檔和狀態碼。所以,之前返回不正常的這個問題,只要強行指定返回狀態碼,就可以正常收到返回的了并且也沒有先前報錯的問題了。 前段時間參與了一個H5項目,里邊有個需求是用戶上傳圖片。當時的方案是前端先調用微信的JSSDK選擇圖片并上傳,然后再從后端下載到服務器上。然而用的時...
閱讀 3794·2021-09-23 11:32
閱讀 2461·2021-09-06 15:01
閱讀 1623·2021-08-18 10:24
閱讀 3458·2019-12-27 11:44
閱讀 3609·2019-08-30 15:52
閱讀 2518·2019-08-30 11:11
閱讀 686·2019-08-29 17:27
閱讀 605·2019-08-29 16:22