react顯示文件上傳進(jìn)度的示例
Axios 是一個(gè)基于 promise 的 HTTP 庫(kù),可以用在瀏覽器和 node.js 中。
在使用react, vue框架的時(shí)候, 如果需要監(jiān)聽(tīng)文件上傳可以使用axios里的onUploadProgress.
react上傳文件顯示進(jìn)度 demo
前端 快速安裝react應(yīng)用
確保有node環(huán)境 npx create-react-app my-app //當(dāng)前文件夾創(chuàng)建my-app文件 cd my-app //進(jìn)入目錄 npm install antd //安裝antd UI組件 npm run start //啟動(dòng)項(xiàng)目
src-> App.js
import React from 'react'; import 'antd/dist/antd.css'; import { Upload, message, Button, Progress } from 'antd'; import { UploadOutlined } from '@ant-design/icons'; import axios from "axios" axios.defaults.withCredentials = true class App extends React.Component { constructor(props) { super(props) this.state = { fileList: [], uploading: false, filseSize: 0, baifenbi: 0 } } //文件上傳改變的時(shí)候 configs = { headers: { 'Content-Type': 'multipart/form-data' }, withCredentials: true, onUploadProgress: (progress) => { console.log(progress); let { loaded } = progress let { filseSize } = this.state console.log(loaded, filseSize); let baifenbi = (loaded / filseSize * 100).toFixed(2) this.setState({ baifenbi }) } } //點(diǎn)擊上傳 handleUpload = () => { const { fileList } = this.state; const formData = new FormData(); fileList.forEach(file => { formData.append('files[]', file); }); this.setState({ uploading: true, }); //請(qǐng)求本地服務(wù) axios.post("http://127.0.0.1:5000/upload", formData, this.configs).then(res => { this.setState({ baifenbi: 100, uploading: false, fileList: [] }) }).finally(log => { console.log(log); }) } onchange = (info) => { if (info.file.status !== 'uploading') { this.setState({ filseSize: info.file.size, baifenbi: 0 }) } if (info.file.status === 'done') { message.success(`${info.file.name} file uploaded successfully`); } else if (info.file.status === 'error') { message.error(`${info.file.name} file upload failed.`); } } render() { const { uploading, fileList } = this.state; const props = { onRemove: file => { this.setState(state => { const index = state.fileList.indexOf(file); const newFileList = state.fileList.slice(); newFileList.splice(index, 1); return { fileList: newFileList, }; }); }, beforeUpload: file => { this.setState(state => ({ fileList: [...state.fileList, file], })); return false; }, fileList, }; return ( <div style={{ width: "80%", margin: 'auto', padding: 20 }}> <h2>{this.state.baifenbi + '%'}</h2> <Upload onChange={(e) => { this.onchange(e) }} {...props}> <Button> <UploadOutlined /> Click to Upload </Button> </Upload> <Button type="primary" onClick={this.handleUpload} disabled={fileList.length === 0} loading={uploading} style={{ marginTop: 16 }} > {uploading ? 'Uploading' : 'Start Upload'} </Button> <Progress style={{ marginTop: 20 }} status={this.state.baifenbi !== 0 ? 'success' : ''} percent={this.state.baifenbi}></Progress> </div > ) } } export default App;
后臺(tái) 使用express搭載web服務(wù)器
1.先創(chuàng)建文件夾webSever cd webSever npm -init -y //創(chuàng)建package.json文件 2.安裝express 以及文件上傳需要的包 npm install express multer ejs 3.創(chuàng)建app.js
app.js
var express = require('express'); var app = express(); var path = require('path'); var fs = require('fs') var multer = require('multer') //設(shè)置跨域訪問(wèn) app.all("*", function (req, res, next) { //設(shè)置允許跨域的域名,*代表允許任意域名跨域 res.header("Access-Control-Allow-Origin", req.headers.origin || '*'); // //允許的header類型 res.header("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With"); // //跨域允許的請(qǐng)求方式 res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); // 可以帶cookies res.header("Access-Control-Allow-Credentials", true); if (req.method == 'OPTIONS') { res.sendStatus(200); } else { next(); } }) app.use(express.static(path.join(__dirname, 'public'))); //模板引擎 app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.get("/", (req, res, next) => { res.render("index") }) //上傳文件 app.post('/upload', (req, res, next) => { var upload = multer({ dest: 'upload/' }).any(); upload(req, res, err => { if (err) { console.log(err); return } let file = req.files[0] let filname = file.originalname var oldPath = file.path var newPath = path.join(process.cwd(), "upload/" + new Date().getTime()+filname) var src = fs.createReadStream(oldPath); var dest = fs.createWriteStream(newPath); src.pipe(dest); src.on("end", () => { let filepath = path.join(process.cwd(), oldPath) fs.unlink(filepath, err => { if (err) { console.log(err); return } res.send("ok") }) }) src.on("error", err => { res.end("err") }) }) }) app.use((req, res) => { res.send("404") }) app.listen(5000)
前端啟動(dòng)之后,啟動(dòng)后臺(tái) node app 即可實(shí)現(xiàn)
以上就是react顯示文件上傳進(jìn)度的示例的詳細(xì)內(nèi)容,更多關(guān)于react顯示文件上傳進(jìn)度的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用React手寫一個(gè)對(duì)話框或模態(tài)框的方法示例
這篇文章主要介紹了使用React手寫一個(gè)對(duì)話框或模態(tài)框的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04React項(xiàng)目中動(dòng)態(tài)插入HTML內(nèi)容的實(shí)現(xiàn)
本文主要介紹了React項(xiàng)目中動(dòng)態(tài)插入HTML內(nèi)容的實(shí)現(xiàn),通過(guò)使用React的dangerouslySetInnerHTML屬性,我們可以將HTML內(nèi)容插入到組件中,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10react如何修改循環(huán)數(shù)組對(duì)象的數(shù)據(jù)
這篇文章主要介紹了react如何修改循環(huán)數(shù)組對(duì)象的數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12ES6 class類鏈?zhǔn)嚼^承,實(shí)例化及react super(props)原理詳解
這篇文章主要介紹了ES6 class類鏈?zhǔn)嚼^承,實(shí)例化及react super(props)原理,結(jié)合實(shí)例形式詳細(xì)分析了ES6 中class類鏈?zhǔn)嚼^承,實(shí)例化及react super(props)原理相關(guān)概念、原理、定義與使用技巧,需要的朋友可以參考下2020-02-02React native ListView 增加頂部下拉刷新和底下點(diǎn)擊刷新示例
這篇文章主要介紹了React native ListView 增加頂部下拉刷新和底下點(diǎn)擊刷新示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04React利用props的children實(shí)現(xiàn)插槽功能
React中并沒(méi)有vue中的?slot?插槽概念?不過(guò)?可以通過(guò)props.children?實(shí)現(xiàn)類似功能,本文為大家整理了實(shí)現(xiàn)的具體方,需要的可以參考一下2023-07-07