react大文件上傳

目錄

大文件上傳優點:

大文件上傳缺點:

?大文件上傳原理:

?為什么要用md5

實現流程:

部分代碼1:

?部分代碼2:?


大文件上傳優點:

  1. 文件太大分片上傳能加快上傳速度,提高用戶體驗
  2. 能斷點續傳?如果上次上傳失敗或者中途離開的話下一次上傳過的就不用重頭開始了
  3. 已經上傳過的文件根據HASH查詢直接秒傳

大文件上傳缺點:

1.后臺可能設置了請求時長限制,太久會上傳失敗(解決:后端不設置上傳時長)

2.NGINX可能設置了文件上傳的最大限制導致失敗(解決:比如分片25M,nginx設置文件上傳最大限度50M)

?大文件上傳原理:

  1. 用戶選擇要上傳的大文件,計算整個文件的MD5。
  2. 前端根據分片大小將文件切分成多個小塊,計算每個分片文件的MD5。
  3. 逐個上傳每個小塊到服務器端。
  4. 服務器端接收并保存每個小塊。
  5. 在服務器端,根據上傳的小塊將它們合并成完整的文件。

?為什么要用md5

????????因為每個文件都會有自己專屬獨立的md5值,就像是每個人的身份證,比如我們在某個平臺發布視頻,將視頻文件二次上傳的時候就會遇到不容易過審的原因,同一個MD5就有很大的機率顯示搬運被退回。剛好后端同學也可以通過MD5這種特性來判斷上傳的文件是否完整。

如何快速計算文件的 md5 值呢? 我們使用 js-spark-md5 這個庫

實現流程:

?????????在upload組件上傳文件的鉤子函數beforeUpload() 中:

  1. ?獲取切片文件:設置切片文件大小、每次上傳的開始字節,每次上傳的結尾字節。文件切片的核心是使用Blob 對象的 slice 方法:
    var blob = file.slice([start [, end [, contentType]]]};
    start 和 end 代表 Blob 里的下標,表示被拷貝進新的 Blob 的字節的起始位置和結束位置。contentType 會給新的 Blob 賦予一個新的文檔類型,很少使用。
  2. ?計算分片文件的MD5
  3. 上傳分片文件,斷點續傳(如何實現斷點續傳,關鍵點是后端需要記錄文件文件切片的信息。用戶在上傳一個文件之前,先詢問服務器,當前文件是否存在已經上傳完畢的切片,如果存在的話,需要返回切片信息。前端根據返回的信息,調整當前的進度,上傳未完成的切片)
  4. 檢驗分片數量及上傳的結果,全部上傳,文件合并
    1. 前端發送切片完成后,發送一個合并請求,后端收到請求后,將之前上傳的切片文件合并。(上面展示的代碼采用 這個)
    2. 后臺記錄切片文件上傳數據,當后臺檢測到切片上傳完成后,自動完成合并。
    3. 創建一個和源文件大小相同的文件,根據切片文件的起止位置直接將切片寫入對應位置。

部分代碼1:

export default class Project extends React.PureComponent {construction (props){this.state({file: {},fileplanNumber: 0, // 上傳文件進度的百分比fileUploadState: '', // 上傳文件的狀態,fail失敗, success成功interFaceStart: '', // 文件上傳時的分片文件下標, 作用于斷點續傳})}beforeUpload = (file) => {this.setState({file,  // 把file存起來})let reader = new FileReader();let md5 = '';reader.onload = (event) => {const spark = new SparkMD5.ArrayBuffer;spark.append(e.target.value);md5 = spark.end();axios.post('', {md5,id, // 后端需要的}).then((res) => {const { fileId, start, finish, message } = res.data.data;if(res.data.code !== 200){message.error(message);}if(finish && finish === 'true'){this.setState({file: {}, // 等于true,表示上傳完成了fileplanNumber: 0, // 上傳文件進度的百分比})message.error(message);return;}// 請求成功后this.setState({fileId,interFaceStart: start, // 文件上傳時,分片文件下標,為了斷點續傳}, () => {this.getSliceFile() // 獲取文件切片})})}reader.readArrayBufffer(file);return false;
}// 獲取文件切片
getSliceFile = async () => {const { search, cataList } = this.props;  const { file, fileId, interFaceStart } = this.state;const archiveId = cataList && cataList[cataList.length - 1].archiveId;const fileSize = file.size; // 文件的大小const piece = 1024 *1024 * 25; // 每片25Mlet start = 0; // 每次上傳開始字節let index = 1;let end = start + piece; // 每次上傳的結尾字節const chunksList = [];while(start < fileSize){const current = Math.min(end, fileSize) // 兩者中取最小的const blob = file.slice.call(file, start, current);// 計算分片文件的MD5let sliceFileMD5 = '';sliceFileMD5 = await this.getSliceFileMD5(blob );// 拼接分片信息數據chunksList.push({file: blod,index,sliceFileMD5,});start = current;end = start + piece;index += 1;}// 檢驗分片數量,開始上傳if (chunksList && chunksList.length) {const chunks = chunksList.slice(interFaceStart); // 分片上傳的結果let resultList = 0;// 循環分片數據for(const item of chunks){// 調用接口上傳分片內容const resultFile  = await this.uploadSliceFile(item, chunks);//記錄上傳結果resultList += 1;// 一次失敗,結束后續上傳if(!resultFile){break;}}// 檢驗分片數量,分片上傳結果數量,全部上傳完成,調用合并接口if(resultList === chunks.length){const { fileList } = this.state;axios.post('', { fileId,fileName: file.name,businessId: archiveId,businessType: 'archive',}).then((res) => {if(res.data.code !== 200){message.error(res.data.message)}message.success('上傳成功!')// 調接口,刷新頁面axios.post('', {pageNum: 1,pageSize: 10,archiveId,orderBy: '',sort: '',  }).then(res => {if(res.code !== 200){message.error(res.message)};})this.setState({file: {},fileId: '',fileUploadState: null,fileplanNumber: 0,fileList,interFaceStart: 0,});})} else {this.setState({fileUploadState: fail,});}}
}// 計算分片文件的MD5getSliceFileMD5 = (blob) => {return new Promise((resolve, reject) => {const sliceFileReader = new FileReader();let sliceFileMD5  = '';sliceFileReader.onerror = reject;sliceFileReader.onload = (event) => {const spark = new SparkMD5.ArrayBuffer();spark.append(event.target.result)sliceFileMD5 = spark.end();// 返回分片MD5resolve(sliceFileMD5);}sliceFileReader.readAsArrayBuffer(blob);})}// 上傳分片文件uploadSliceFile = (fileMap, chunks) => {return new Promise((resolve, reject) => {const { sliceFileMD5, file, index } = fileMap;const fileBlob = new File([file], 'AAA.exe', { type: 'application/x-msdownload' })const { fileId } = this.state;const formData = new FormData();formData.append('fileId', fileId);formData.append('MD5', sliceFileMD5);formData.append('partSequence', index);formData.append('fileBlob', fileBlob);axios.post('', {formData,headers: {'Content-Type': 'multipart/form-data',}}).then(res => {if(res.data.code !== 200){message.error(res.data.message)return false;}const fileplanNumber = (index / chunks.length) * 100;this.setState({fileplanNumber,});resolve(true);})})}}

?部分代碼2:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160759.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160759.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160759.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

簡單工程模式

代碼實現 //simpleFactory.h #ifndef _SimpleFactory_H_ #define _SimpleFactory_H_#include <iostream> #include <exception> #include <string>using namespace std;class Operation { protected:double _numberA 0;double _numberB 0; public:Operat…

udp通信socket關閉后,緩存不清空

udp通信socket關閉后&#xff0c;緩存不清空 udp通信socket關閉后&#xff0c;緩存不清空如何清空udp緩存 udp通信socket關閉后&#xff0c;緩存不清空 關閉一個 UDP socket 連接后&#xff0c;底層接收緩沖區中存儲的數據不會被清空。實際上&#xff0c;關閉 socket 連接并不…

MybatisX插件使用

Mybatis X插件 MybatisX 是一款基于 IDEA 的快速開發插件&#xff0c;為效率而生。MybatisX官網&#xff1a;https://baomidou.com/pages/ba5b24/#%E5%8A%9F%E8%83%BD安裝方法&#xff1a;打開 IDEA&#xff0c;進入 File -> Settings -> Plugins&#xff0c;輸入 mybat…

三維控件中定位一個點_vtkPointWidget

開發環境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example參考代碼 demo解決問題&#xff1a;允許用戶使用三維光標在三維空間中定位一個點。關鍵類vtkPointWidget , 光標具有輪廓邊界框、軸對齊十字準線和軸陰影&#xff…

AD7021C 觸摸感應加燈光調節芯片IC 可用于觸摸臺燈、觸摸玩具燈等

AD7021C觸摸感應 IC 是為實現人體觸摸界面而設計的集成電路。可替代機械式輕觸按鍵&#xff0c;實現防水防塵、密封隔離、堅固美觀的操作界面。使用該芯片可以實現 LED 燈光亮度調節&#xff0c;方案所需的外圍電路簡單&#xff0c;操作方便。確定好靈敏度選擇電容&#xff…

【華為OD題庫-033】經典屏保-java

題目 DVD機在視頻輸出時&#xff0c;為了保護電視顯像管&#xff0c;在待機狀態會顯示"屏保動畫”&#xff0c;如下圖所示,DVD Logo在屏幕內來回運動&#xff0c;碰到邊緣會反彈:請根據如下要求&#xff0c;實現屏保Logo坐標的計算算法 1、屏幕是一個800 * 600像素的矩形&…

Vue3 provide 和 inject 實現祖組件和后代組件通信

provide 和 inject 能夠實現祖組件和其任意的后代組件之間通信&#xff1a; 一、provide 提供數據 我們在祖組件中使用provide 將數據提供出去。 使用provide 之前需要先進行引入&#xff1a; import { provide } from "vue"; 語法格式如下&#xff1a; provide(&q…

objectarx + libcurl下載文件遇到的問題

下載失敗導致cad崩潰,報錯’Error handler re-entered.Exiting now ,原因是因為我將libcurl相關的功能繼承到一個類中,在類中進行相關的webapi交互,但是由于最開始進行了請求所以沒有將curl進行初始化導致的傳遞數據錯誤.只需要在函數開始時進行初始化即可. curl curl_easy_i…

山西電力市場日前價格預測【2023-11-23】

日前價格預測 預測說明&#xff1a; 如上圖所示&#xff0c;預測明日&#xff08;2023-11-23&#xff09;山西電力市場全天平均日前電價為148.77元/MWh。其中&#xff0c;最高日前電價為420.40元/MWh&#xff0c;預計出現在18:00。最低日前電價為0.00元/MWh&#xff0c;預計出…

微信小程序開發學習——頁面布局、初始導航欄與跳轉

1.盒模型 要求實現效果如圖所示&#xff1a; 所有WXML元素都可以看作盒子&#xff0c;在WXSS中"box model”這一術語是用來設計和布局時使用盒模型本質上是一個盒子&#xff0c;封裝周圍的WXML元素它包括: 邊距&#xff0c;邊框&#xff0c;填充和實際內容&#xff0c;模…

【Java并發編程十一】同步控制三

LockSupport 線程阻塞工具 LockSupport的unpark() 方法可以先執行。 import java.util.ArrayList; import java.util.Random; import java.util.concurrent.*; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.LockSupport; import java.uti…

RAW RGB YUV數據差異

目錄 顏色與色彩空間 RAW圖像 RGB圖像 YUV圖像 顏色與色彩空間 顏色 顏色是人眼感知到的現象&#xff0c;它是由光波的頻率和強度所決定的&#xff0c;僅僅存在于人的眼睛和大腦中&#xff0c;因此為了方便描述顏色&#xff0c;引入了色彩空間。色彩空間 色彩空間&#xff…

C語言--數組與指針--打印字符串的n種方式

一.知識背景 一維數組名的含義 arr一般表示數組的起始地址&#xff08;除了兩種例外&#xff09; 1.在定義數組的同一個函數中(不是形參),求sizeof(arr),求整個數組的字節數 2.在定義數組的同一個函數中(不是形參),&arr1,加整個數組的大小 (經常考試) 3.除上面以外,arr都表…

和鯨 × 暨大經管:高效 SAAS 服務持續賦能交叉學科應用型數據人才培養

隨著新一輪科技革命與產業變革的加速演進&#xff0c;擁有學科背景的應用型數據科學人才逐漸成為我國政產學研各界的人力資源需求重點。為響應需求&#xff0c;國家愈發重視新生力量數據思維與意識的培養&#xff0c;各高校也紛紛探索如何以新興信息技術賦能傳統主流學科。 在…

達索系統SOLIDWORKS流體分析網格劃分失敗,大多是這2種原因

SOLIDWORKS Flow Simulation 是直觀的流體力學 (CFD) 分析軟件&#xff0c;該軟件功能強大、操作人性化&#xff0c;快速輕松的分析產品內部或外部流體的流動情況&#xff0c;以用來改善產品性能和功能。 當流體分析運行網格劃分時&#xff0c;提示失敗。 這是由于凸起面與圓…

【LeetCode刷題】--43.字符串相乘

43.字符串相乘 方法一&#xff1a;做加法&#xff0c;模擬豎式乘法的方法計算乘積 class Solution {public String multiply(String num1, String num2) {if(num1.equals("0") || num2.equals("0")){return "0";}String res "0";//nu…

Hadoop -hdfs的讀寫請求

1、HDFS寫數據&#xff08;宏觀&#xff09;&#xff1a; 1、首先&#xff0c;客戶端發送一個寫數據的請求&#xff0c;通過rpc與NN建立連接&#xff0c;NN會做一些簡單的校驗&#xff0c;文件是否存在&#xff0c;是否有空間存儲數據等。 2、NN就會將校驗的結果發送給客戶端…

3、基礎入門——抓包封包協議APP小程序PC應用web應用

知識點 APP&小程序&PC抓包HTTP/S數據——Charles、Fiddler、Burpsuit;程序進程&網絡接口&其他協議抓包——Wireshark、科來網絡分析系統、TCPDump(linux)&#xff1b;通訊類應用封包分析發送接收——WPE四件套封包、科來網絡分析系統。模擬器&#xff1a;逍遙…

解決requests庫進行爬蟲ip請求時遇到的錯誤的方法

目錄 一、超時錯誤 二、連接錯誤 三、拒絕服務錯誤 四、內容編碼錯誤 五、HTTP錯誤 在利用requests庫進行網絡爬蟲的IP請求時&#xff0c;我們可能會遇到各種錯誤&#xff0c;如超時、連接錯誤、拒絕服務等等。這些錯誤通常是由目標網站的限制、網絡問題或我們的爬蟲代碼中…

前端性能優化總結

這里寫目錄標題 頁面性能測試工具測試指標 前端頁面性能常見的問題前端頁面性能優化常見策略及方案dns優化------預解析域名&#xff08;異步進行&#xff09;http請求優化減少請求次數同時多開持久連接 前面面試url從輸入到確認搜索發生了什么js介紹new一個對象的過程&#xf…