中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

React中阿里云OSS上傳文件的方法有哪些

發布時間:2020-08-12 15:46:29 來源:億速云 閱讀:831 作者:小新 欄目:開發技術

小編給大家分享一下React中阿里云OSS上傳文件的方法有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

簡介

阿里云 OSS 是 阿里云提供的海量、安全、低成本、高可靠的云存儲服務,提供 99.9999999999%的數據可靠性(號稱)。能夠使用 RESTful API 可以在互聯網任何位置存儲和訪問,支持容量和處理能力彈性擴展。

基本術語

1.bucket :類似本地的一個文件夾
2.object : oss 存儲數據的基本單元,類似本地的一個文件。
3.region:oss 存儲的數據中心所在區域
4.Endpoint:oss 對外服務的訪問域名,oss 以 http api 提供服務,不同 region 的 edpoint 不同。
5.AccessKey:訪問秘鑰,簡稱 AK,包括 AccessKeyId 和 AccessKeySecret,用于驗證訪問者身份。后者必須保密

跨域 CROS 設置

進入 控制臺-》基本設置-》跨域-》新增 彈出對話框以后填入來源:域名和端口信息。我們如果使用類似之前 Azure 中 blob 網頁直接上傳的服務器的方式時需要配置跨域,域名和端口綁定我們的不同環境對應的域名和端口

OSS 操作

創建文件存放位置

進入控制臺-》創建 bucket -》填寫配置 -》完成

控制臺上傳下載(簡單測試)

文件管理-》創建目錄 -》上傳文件

生成 AccessKey 及 AccessSecrect

點擊頭像 -》AccessKey 管理 -》開始使用子用戶 Key -》填寫子用戶名,勾選編程訪問,確定 -》驗證碼接受填寫,確定 -》得到 key 和 Secret -》權限管理-》授權 -》新增管理對象存儲 OSS 權限

React中阿里云OSS上傳文件的方法有哪些

注意:這里必須使用子用戶的 key,如果用主賬號容易導致提交代碼時的權限泄露,一旦 key 和 secret 泄露相當于賬號密碼泄露,服務器就完全暴露給了別人。

API 操作

實際項目中并不是依靠在控制臺手工操作,而是利用程序來控制上傳下載。OSS 提供了一系列的 restful API 來實現文件上傳于下載。

可以利用阿里云提供的 SDK 簡化實現。具體見下文。

前端上傳文件程序開發

基本流程

在實際項目中,一般采用分布式及微服務的 web 業務系統中,文件的上傳和下載都是直接在前端來實現對 oss 的操作。也就是前端直接上傳,不通過自己的服務器。這樣能夠實現系統無阻礙的橫向擴展。另一個原因是如果要把文件保存在運行 web 服務器的同一臺服務器上時,那么在文件上傳時可能會占滿帶寬,影響 web 的訪問。分開存儲不占服務器帶寬。

阿里 OSS 提供了三種前端直傳方式:

1.瀏覽器簽名后直接上傳 OSS(無需服務端干預)
2.瀏覽器請求服務器簽名地址后上傳(需要服務端配合)
3.瀏覽器請求服務器簽名地址后上傳并回調服務端(需要服務端配合)

實際生產環境考慮到安全性必須選擇第二種,需要服務端與前端相配合,當安全性要求不高時可采用第一種方式。分別如下。

方式 1:前端直傳(無須服務端干預)

為保證文件的安全性,一般設置 bucket 為私有,也就是鑒權以后的用戶才能訪問 OSS 中的內容。前端直傳的原理是在瀏覽器端根據 OSS 控制臺提供的 AccessId 和 AccessSecret 生成簽名直接上傳,不需要經過服務端,優點是使用簡單,缺點是不安全。

React 搭配 antd 中 upload 組件實現如下:

upload 組件提供了 beforeUpload鉤子函數,在執行向 OSSpost 文件前我們先在本地計算好 OSS 要求的簽名,如下:

beforeUpload = async () => {
 const { OSSData } = this.state;
 const expire = OSSData.expire * 1000;

 if (expire < Date.now()) {
  await this.init();
 }
 return true;
};

init = async () => {
 try {
  const OSSData = await this.mockGetOSSData();

  this.setState({
   OSSData,
  });
 } catch (error) {
  message.error(error);
 }
};
mockGetOSSData = () => {
 var policyText = {
  expiration: "2020-12-01T12:00:00.000Z", //設置該Policy的失效時間,超過這個失效時間之后,就沒有辦法通過這個policy上傳文件了
  conditions: [
   ["content-length-range", 0, 1048576000], // 設置上傳文件的大小限制
  ],
 };
 let accesskey = "你自己的"; //不要泄露
 var policyBase64 = Base64.encode(JSON.stringify(policyText));
 let message = policyBase64;
 var bytes = Crypto.HMAC(Crypto.SHA1, message, accesskey, { asBytes: true });
 var signature = Crypto.util.bytesToBase64(bytes);

 return {
  dir: "user-dir/", //bucket中的路徑
  expire: "0", //有效時間戳'1577811661',
  host: "http://om-test-oss.oss-cn-beijing.aliyuncs.com",
  accessId: "你自己的",
  policy: policyBase64, //you
  signature: signature,
 };
};

鉤子函數首先計算簽名是否過期,如果過期則通過init函數間接調用mockGetOSSData生成通過 Base64 等 OSS 要求方法生成簽名數據。其中accessIdaccesskey是從 OSS 控制臺拿到的。

生成簽名數據后,利用upload組件中actionprops 直接將文件上傳目的地指向 OSS 的實際有效地址,并進行上傳

render() {
  const { value } = this.props;
  const props = {
   name: 'file',
   listType: "picture-card",
   fileList: value,
   action: this.state.OSSData.host,
   onChange: this.onChange,
   onRemove: this.onRemove,
   transformFile: this.transformFile,
   data: this.getExtraData,
   beforeUpload: this.beforeUpload,
  };
  return (
   <Upload {...props}>
    <Icon type="plus" />
   </Upload>
  );
 }

完整代碼如下:

render() {
  const { value } = this.props;
  const props = {
   name: 'file',
   listType: "picture-card",
   fileList: value,
   action: this.state.OSSData.host,
   onChange: this.onChange,
   onRemove: this.onRemove,
   transformFile: this.transformFile,
   data: this.getExtraData,
   beforeUpload: this.beforeUpload,
  };
  return (
   <Upload {...props}>
    <Icon type="plus" />
   </Upload>
  );
 }

方式 2:前端與后端配合上傳

后端鑒權接口

后端需要增加一個接口:后端利用阿里提供的 SDK,編寫鑒權接口,入參是要上傳的文件內容,根據控制臺得到的 endpoint、AccessKey 和 AccessSecret 實例化 client,每次前端上傳文件前請求本接口,服務端與阿里云 OSS 交互,根據 bucket 拿到簽名后的上傳、下載地址(過程中可以設置上傳下載的有效期以及 Conetent-Type),將兩者以及文件名返回給前端,用于前端的下一步操作。

React中阿里云OSS上傳文件的方法有哪些

前端分別請求

前端然后根據后端鑒權接口返回簽名后的 puturl 采用 put 方式上傳圖片文件。在前端 put 上傳圖片成功后可以通過 geturl 拿到圖片來進行網頁回顯,回顯同時將圖片名稱插入到要提交表單中,最后點擊提交按鈕將圖片路徑等信息 post 到自己后端另一個接口中,后端保存到數據庫。

前端程序與上文中的方式 1 大同小異,唯一不同在于mockGetOSSData函數,之前是由前端計算簽名,這里是調用后端的鑒權接口來獲得簽名數據。

**注意:**最后一個接口調用中文件名稱只有后半部分,前半部分路徑是 OSS 提供的 bucket 路徑,完全相同,再次展示時前端自行拼接。

上傳中途失敗處理

上述前端直傳流程至少調用三個接口:鑒權、上傳、保存。如果在上傳文件后沒有調用保存接口,也就是應用服務沒有把 OSS 中文件關聯到數據庫中時會造成 OSSbucket 中有臟數據的情況,解決辦法是:先讓用戶上傳到一個臨時的文件夾中,當調用保存接口后再移動到真正的 bucket 中,然后定時刪除臨時文件夾。

前端下載文件程序開發

與上傳類似,OSS 也支持瀏覽器下載,在 bucket 的讀寫權限設置為私有后,讀寫均需簽名才可以。舉例如下:

如果上傳圖片到 OSS 成功后,得到的圖片 url 是user-dir/1580982085120.png,如果直接拼接 OSS 前半部分為http://om-test-oss.oss-cn-beijing.aliyuncs.com/user-dir/1580982085120.png訪問會提示失敗,因為 OSS 有判斷沒有簽名信息會拒絕訪問,真正的簽名后的圖片地址是:http://om-test-oss.oss-cn-beijing.aliyuncs.com/user-dir/1580982085120.png&#63;OSSAccessKeyId=LTAI4Fv75GobJhGFkwVzdPJq&Expires=1580983892&Signature=FZYmRRo6XnFu3INC55zJSdTWT%2Fc%3D

我們要做的就是得到簽名后的下載地址。下載與上傳相同,也分為是否需要服務器參與的兩種方式。

方式 1:前端簽名直接下載

前端簽名與上傳類似,根據 AccessId 與 AccessSecret 來生成簽名信息。

簽名信息可以在請求攜帶在 URL 中也可以攜帶在請求 header 中,為方便使用,此次調研使用前者。

本地簽名使用了 OSS 提供的 SDK,react 首先安裝

npm install ali-oss --save

然后在組件中引入

import OSS from "ali-oss";

封裝 SDK 的簽名方法簡化使用

import React, { Component } from "react";
import OSS from "ali-oss";
let GetOssfileClient = new OSS({
 region: "oss-cn-beijing", //oss所在region,由運維提供
 accessKeyId: "你自己的", //oss的子accessKeyId,由運維提供
 accessKeySecret: "你自己的", //oss的子accessKeySecret,由運維提供
 bucket: "om-test-oss", //oss的buket名稱,運維提供
});
export default GetOssfileClient;

上傳組件的預覽功能使用到了圖片下載如下:

//預覽可以使用本地圖片也可以使用上傳到oss真實圖片,這里使用真實地址用來測試對oss的訪問
handlePreview = (file) => {
 //file中thumbUrl是本地生成的,url是OSS文件名部分,需要簽名后才能訪問
 console.log("替換前的 file.url", file.url);
 let url = GetOssfileClient.signatureUrl(file.url);
 console.log(url);
 file.url = url; //替換為簽名后的真實路徑,
 console.log("替換后的 file.url,也就是真實地址是:", file.url);
 this.setState({
  previewImage: file.url || file.thumbUrl,
  previewVisible: true,
 });
};

這里使用 upload 組件預覽功能來測試圖片的下載顯示。當點擊預覽觸圖標時會觸發handlePreview函數,我們拿到真實圖片文件的文件名,然后使用 sdk 的signatureUrl方法簽名后得到真實路徑,然后在 modal 中顯示。

<Modal visible={previewVisible} footer={null} onCancel={this.handleCancel}>
 <img alt="example" style={{ width: "100%" }} src={previewImage} />
</Modal>

方式 2:前端根據后端返回的連接下載

同上述前端上傳文件程序開發->方式2,前端直接使用后端代碼返回的 url 來顯示圖片即可,后端返回的 url 已經是簽名后的完整路徑了。

安全起見,最好使用前后端配置上傳下載

以上是React中阿里云OSS上傳文件的方法有哪些的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泸水县| 天津市| 金阳县| 突泉县| 崇义县| 侯马市| 三台县| 清河县| 南溪县| 额尔古纳市| 荆门市| 垣曲县| 遵义县| 吴忠市| 新宁县| 区。| 安国市| 武夷山市| 仪陇县| 新绛县| 汶上县| 郯城县| 武冈市| 天峨县| 潮安县| 那坡县| 东山县| 怀宁县| 乌审旗| 泽普县| 西昌市| 新蔡县| 二连浩特市| 东城区| 永宁县| 新郑市| 浙江省| 甘谷县| 镇赉县| 西城区| 大埔县|