react显示文件上传进度的示例

目录
  • react上传文件显示进度 demo
    • 前端 快速安装react应用
    • src-> App.js
    • 后台 使用express搭载web服务器
    • app.js

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

react上传文件显示进度 demo

前端 快速安装react应用

?

1

2

3

4

5

6

7

确保有node环境

npx create-react-app my-app //当前文件夹创建my-app文件

cd my-app //进入目录

npm install antd //安装antd UI组件

npm run start //启动项目

src-> App.js

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

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

2

3

4

5

6

7

8

1.先创建文件夹webSever

cd webSever

npm -init -y //创建package.json文件

2.安装express 以及文件上传需要的包

npm install express multer ejs

3.创建app.js

app.js

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

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显示文件上传进度的示例的详细内容,更多关于react显示文件上传进度的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/kongyijilafumi/p/13293409.html

本文链接:https://my.lmcjl.com/post/15409.html

展开阅读全文

4 评论

留下您的评论.