react將文件轉(zhuǎn)為base64上傳的示例代碼
需求
將圖片、pdf、word、excel等文件進(jìn)行上傳。圖片、pdf等調(diào)接口A、word、excel等附件調(diào)接口B。接口關(guān)于文件是base64格式的參數(shù)
業(yè)務(wù)場(chǎng)景
上傳資源,區(qū)分影像與附件
邏輯思路
- 使用原生input標(biāo)簽,type='file',進(jìn)行上傳
- 上傳后的回調(diào),對(duì)文件進(jìn)行分類,影像與附件
- 對(duì)文件進(jìn)行base64編碼
- 執(zhí)行接口進(jìn)行上傳
代碼實(shí)現(xiàn)
點(diǎn)擊input進(jìn)行上傳,選擇文件后執(zhí)行onChange回調(diào)
<input
type="file"
multiple
ref={uploadInputRef}
onChange={uploadFileOnChange}
/>對(duì)文件進(jìn)行分類,我這里是通過(guò)type去判斷的
export const uploadFileOnChange = async (e: ChangeEvent<HTMLInputElement>) => {
? const files = e.target.files;
? // 將影像以及附件分類
? const images: File[] = [];
? const attachments: File[] = [];
? for (const iterator of files ?? []) {
? ? if (
? ? ? iterator.type.includes('sheet') ||
? ? ? iterator.type.includes('excel') ||
? ? ? iterator.type.includes('csv') ||
? ? ? iterator.type.includes('word')
? ? ) {
? ? ? attachments.push(iterator);
? ? } else {
? ? ? images.push(iterator);
? ? }
? }
};對(duì)文件進(jìn)行base64編碼
async function readFileAsDataURL(file: Blob) {
? const result_base64 = await new Promise<string>((resolve) => {
? ? const fileReader = new FileReader();
? ? fileReader.readAsDataURL(file);
? ? fileReader.onload = () =>
? ? ? typeof fileReader.result === 'string' && resolve(fileReader.result);
? });
? return result_base64.split('base64,')[1];
}
export const uploadFileOnChange = async (e: ChangeEvent<HTMLInputElement>) => {
? const files = e.target.files;
? // 將影像以及附件分類
? const images: File[] = [];
? const attachments: File[] = [];
? for (const iterator of files ?? []) {
? ? if (
? ? ? iterator.type.includes('sheet') ||
? ? ? iterator.type.includes('excel') ||
? ? ? iterator.type.includes('csv') ||
? ? ? iterator.type.includes('word')
? ? ) {
? ? ? attachments.push(iterator);
? ? } else {
? ? ? images.push(iterator);
? ? }
? }
? const imageData: ImageData[] = [];
? const affixData: AffixData[] = [];
? for (const i of images) {
? ? const imgBase64 = await readFileAsDataURL(i);
? ? imageData.push({
? ? ? name: i.name,
? ? ? imgBase64,
? ? });
? }
? for (const i of attachments) {
? ? const affixBase64 = await readFileAsDataURL(i);
? ? affixData.push({
? ? ? name: i.name,
? ? ? affixBase64,
? ? });
? }
? return {
? ? imageData,
? ? affixData,
? };
};拿到上一步返回的數(shù)據(jù)調(diào)接口
到此這篇關(guān)于react將文件轉(zhuǎn)為base64上傳的示例代碼的文章就介紹到這了,更多相關(guān)react將文件轉(zhuǎn)為base64進(jìn)行上傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React?+?ECharts動(dòng)態(tài)折線圖完整實(shí)現(xiàn)代碼
ECharts作為國(guó)內(nèi)最流行的可視化庫(kù),其實(shí)內(nèi)置了非常強(qiáng)大的線條特效和動(dòng)畫(huà)能力,這篇文章主要介紹了React + ECharts動(dòng)態(tài)折線圖的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2026-03-03
React18中請(qǐng)求數(shù)據(jù)的官方姿勢(shì)適用其他框架
這篇文章主要為大家介紹了官方回答在React18中請(qǐng)求數(shù)據(jù)的正確姿勢(shì)詳解,同樣也適用其他框架,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
詳解如何封裝和使用一個(gè)React鑒權(quán)組件
JavaScript?和?React?提供了靈活的事件處理機(jī)制,特別是通過(guò)利用事件的捕獲階段來(lái)阻止事件傳播可以實(shí)現(xiàn)精細(xì)的權(quán)限控制,本文將詳細(xì)介紹這一技術(shù)的應(yīng)用,并通過(guò)實(shí)踐案例展示如何封裝和使用一個(gè)?React?鑒權(quán)組件,需要的可以參考下2024-03-03
react中使用Modal.confirm數(shù)據(jù)不更新的問(wèn)題完美解決方案
這篇文章主要介紹了react中使用Modal.confirm數(shù)據(jù)不更新的問(wèn)題解決方案,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
React+TS+IntersectionObserver實(shí)現(xiàn)視頻懶加載和自動(dòng)播放功能
通過(guò)本文的介紹,我們學(xué)習(xí)了如何使用 React + TypeScript 和 IntersectionObserver API 來(lái)實(shí)現(xiàn)一個(gè)視頻播放控制組件,該組件具有懶加載功能,只有在用戶滾動(dòng)頁(yè)面且視頻進(jìn)入視口時(shí)才開(kāi)始下載視頻資源,需要的朋友可以參考下2023-04-04
React Electron生成桌面應(yīng)用過(guò)程
這篇文章主要介紹了React+Electron快速創(chuàng)建并打包成桌面應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12
react子組件接收的props賦值給state的陷阱問(wèn)題
這篇文章主要介紹了react子組件接收的props賦值給state的陷阱問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03

