react上传文件显示上传进度

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
在使用react,vue框架的时候,如果需要监听文件上传可以使用axios里的onUploadProgress.

react上传文件显示进度 demo

  • 前端 快速安装react应用
确保有node环境

npx create-react-app my-app //当前文件夹创建my-app文件
cd my-app 进入目录
npm install antd  安装antd UI组件

npm run start 启动项目
  • 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
    }
  }
  文件上传改变的时候
  configs = {
    headers: { 'Content-Type': 'multipart/form-data' },withCredentials:  {
      console.log(progress);
      let { loaded } = progress
      let { filseSize } = this.state
      console.log(loaded,filseSize);
      let baifenbi = (loaded / filseSize * 100).toFixed(2)
      .setState({
        baifenbi
      })
    }
  }
  点击上传
  handleUpload = () => {
    const { fileList } = .state;
    const formData = new FormData();
    fileList.forEach(file => {
      formData.append('files[]'.setState({
      uploading: 请求本地服务
    axios.post("http://127.0.0.1:5000/upload",formData,this.configs).then(res => {
      .setState({
        baifenbi: 100finally(log => {
      console.log(log);
    })
  }
  onchange = (info) => {
    if (info.file.status !== 'uploading') {
      .setState({
        filseSize: info.file.size,1)">
      })
    }
    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 } = .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 => ({
          fileList: [...state.fileList,file],}));
        return ;
      },fileList,};
     (
      <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={.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;
  • 后台 使用express搭载web服务器
1.先创建文件夹webSever
  cd webSever
  npm -init -y  //创建package.json文件

2.安装express 以及文件上传需要的包
  npm install express multer ejs

3.创建app.js
  • app.js
var express = require('express');
var app = express();
var path = require('path'var fs = require('fs')
var multer = require('multer'设置跨域访问
app.all("*",1)">function (req,res,next) {
    设置允许跨域的域名,*代表允许任意域名跨域
    res.header("Access-Control-Allow-Origin",req.headers.origin || '*');
     //允许的header类型
    res.header("Access-Control-Allow-Headers","Content-Type,Authorization,X-Requested-With" //跨域允许的请求方式 
    res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS" 可以带cookies
    res.header("Access-Control-Allow-Credentials",1)">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,next) => {
    res.render("index")
})
上传文件
app.post('/upload',1)"> {

    var upload = multer({ dest: 'upload/' }).any();
  
    upload(req,err =>if (err) {
        console.log(err);
        
      }
      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,1)"> {
           (err) {
            console.log(err);
            
          }
          res.send("ok")
        })
  
      })
      src.on("error",err => {
        res.end("err")
      })
  
    })
  
  })
  

app.use((req,res) => {
    res.send("404")
})
app.listen(5000)

  前端启动之后,启动后台 node app 即可实现

 

相关文章

react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接...
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc ...