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,
baifenbi: 0
}
}
//文件上传改变的时候
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
})
}
}
//点击上传
handleUpload = () => {
const { fileList } = this.state;
const formData = new FormData();
fileList.forEach(file => {
formData.append('files[]', file);
});
this.setState({
uploading: true,
});
//请求本地服务
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;
  • 后台 使用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("*", 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", 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)

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

react上传文件显示上传进度的更多相关文章

  1. ajax上传文件显示进度

    下面要做一个ajax上传文件显示进度的操作,文末有演示地址 这里先上代码: 1.前端代码 upload.html <!DOCTYPE html> <html lang="e ...

  2. vue-resource+iview上传文件取消上传

    vue-resource+iview上传文件取消上传 子组件: <template> <div class="upload-area-div"> <U ...

  3. axios+Vue上传文件显示进度

    一,前言 最近在用Vue,然后上传文件时需要显示进度,于是网上搜了一下,经过自己实测终于也弄明白了 二,效果 三,代码 HTML代码 <div id="app"> &l ...

  4. HTML5上传文件显示进度

    下面我们使用Html 5的新特性file api实现上传文件,并显示上传文件进度百分比.意图是这样的,当选择文件时,显示当前文件信息.这里我们是结合Asp.net MVC做为服务端,您也可以是其它的服 ...

  5. jQuery上传文件显示进度条

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script sr ...

  6. Linux学习23-Xftp上传文件显示乱码问题

    前言 当我们在windows新建一个文件,里面有中文时,使用Xftp上传到linux服务器上,会出现乱码问题. Windows的默认编码为GBK Linux的默认编码为UTF-8 Xftp上传文件乱码 ...

  7. ASP.NET上传文件,已经上传的大小保存在session中,在另一个页面中读取session的值不行

    想自己做个ASP.NET上传文件时显示进度条的, 按照自己的想法,其实也就是显示每次已经上传的字节,从网上找到一个方法是能够把文件变成流以后再慢慢写入的,我在那个循环写入的时候每循环一次都把已经上传的 ...

  8. php 上传文件实例 上传并下载word文件

    上传界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  9. 异步上传文件,ajax上传文件,jQuery插件之ajaxFileUpload

    http://www.cnblogs.com/kissdodog/archive/2012/12/15/2819025.html 一.ajaxFileUpload是一个异步上传文件的jQuery插件. ...

  10. php 上传文件并对上传的文件进行简单验证(错误信息,格式(防伪装),大小,是否为http上传)

    <body> <?php /** *验证错误 *如果有错,就返回错误,如果没错,就返回null */ function check($file) { //1:验证是否有误 if($f ...

随机推荐

  1. 使用 Python 旋转PDF页面、或调整PDF页面顺序

    在将纸质文档扫描成PDF电子文档时,有时可能会出现页面方向翻转或者页面顺序混乱的情况.为了确保更好地浏览和查看PDF文件,本文将分享一个使用Python来旋转PDF页面或者调整PDF页面顺序的解决方案 ...

  2. mini-centos7 环境安装部署,各种踩坑。。。

    最小Linux系统,安装Java环境 想想就生气,去面试个运维,面试官让我上机装个centos7,还是个最小安装包连界面都没有,只有命令行模式,我都哭了,然后让把一些环境装一下,然后再部署个sprin ...

  3. Vue 3指令与事件处理

    title: Vue 3指令与事件处理 date: 2024/5/25 18:53:37 updated: 2024/5/25 18:53:37 categories: 前端开发 tags: Vue3 ...

  4. 图解JDK7及其早期版本HashMap扩容死锁问题

    在JDK7及其早期版本中HashMap在多线程环境下会发生扩容死锁的问题. HashMap中在创建时默认会有16个桶,有一个默认加载因子0.75,如果Map中的Entry数量达到阈值(16*0.75) ...

  5. Vue cli构建项目

    一.创建项目 vue create hello-world 你会被提示选取一个 preset.你可以选默认的包含了基本的 Babel + ESLint 设置的 preset,也可以选"手动选 ...

  6. 浏览器打开JupyterLab后所有快捷键与窗口按键均失效怎么办?

      本文介绍JupyterLab中菜单栏按钮无法点击.快捷键无法执行问题的解决办法.   近期打开JupyterLab后,发现其中菜单栏按钮无法点击,快捷键也均无法执行.如图,红框内的按钮点击均无任何 ...

  7. C#调用微软api文本转语音

    目录 1.注册微软云服务,搭建文本转语音标准应用(每月500万字免费好像) 2.Visual studio使用nuget给程序安装Microsoft.CognitiveServices.Speech框 ...

  8. 微服务新体验之Aspire初体验

    安装aspire 查看vs版本 我这的版本是17.9.7,不支持aspire,所以需要升级 更新VS 点击 帮助->检查更新 点击更新 静等安装升级 创建aspire项目 项目创建成功,如下图 ...

  9. jenkins任务构建

    创建一个Jenkins任务并构建项目: 这个项目名称只要确定,它就会在 /var/lib/jenkins/jobs/ 生成一个 freestyle 的目录,如果需要删除,删除了就需要重启Jenkins ...

  10. 7.22考试总结(NOIP模拟23)[联·赛·题]

    不拼尽全力去试一下,又怎么会知道啊 前言 又是被细节问题搞掉的一天. T1 的话,与正解相差无几,少打了两个 else 一个 ls 打成了 rs,然后就爆零了(本来还有 45pts 的),然后加了一个 ...