如果您打算使用 node 和 express 上传文件,那么您必须同时创建服务器和客户端。服务器有 api,客户端将使用它通过 axios 上传文件。
首先,我们要放入 express、explicit-fileupload、cors 和 nodemon 四个包。运行以下命令来安装应用程序。
npm i express express-fileupload cors nodemon
现在在您最喜欢的代码编辑器中打开 fileupload 文件夹并创建一个名为 server.js 的全新文档。
const express = require('express');
const fileUpload = require('express-fileupload');
const cors = require('cors')
const app = express();
app.use(express.static('public'));
app.use(cors());
app.use(fileUpload());
app.post('/upload', (req, res) => {
if (!req.files) {
return res.status(500).send({ msg: "file is not found" })
}
const myFile = req.files.file;
myFile.mv(`${__dirname}/public/${myFile.name}`, function (err) {
if (err) {
console.log(err)
return res.status(500).send({ msg: "Error occured" });
}
return res.send({name: myFile.name, path: `/${myFile.name}`});
});
})
app.listen(4500, () => {
console.log('server is running at port 4500');
})
用于node server.js
启动服务器运行。
在您最喜欢的代码编辑器上打开 react app 文件夹,并在 src 文件夹中创建一个名为 fileupload.js 的全新报告。现在上传以下代码。
import React, { useRef, useState } from 'react';
import axios from 'axios';
function FileUpload() {
const [file, setFile] = useState('');
const [data, getFile] = useState({ name: "", path: "" });
const [progress, setProgess] = useState(0);
const el = useRef();
const handleChange = (e) => {
setProgess(0)
const file = e.target.files[0];
console.log(file);
setFile(file);
}
const uploadFile = () => {
const formData = new FormData();
formData.append('file', file);
axios.post('http://localhost:4500/upload', formData, {
onUploadProgress: (ProgressEvent) => {
let progress = Math.round(
ProgressEvent.loaded / ProgressEvent.total * 100) + '%';
setProgess(progress);
}
}).then(res => {
console.log(res);
getFile({ name: res.data.name,
path: 'http://localhost:4500' + res.data.path
})
}).catch(err => console.log(err))}
return (
<div>
<div className="file-upload">
<input type="file" ref={el} onChange={handleChange} />
<div className="progessBar" style={{ width: progress }}>
{progress}
</div>
<button onClick={uploadFile} className="upbutton">
Upload
</button>
<hr />
{/* displaying received video*/}
{data.path && <video src={data.path} autoPlay controls />}
</div>
</div>
);
}
export default FileUpload;
现在在 App.js 文件中导入 FileUpload 组件。
import React from 'react';
import FileUpload from './fileupload';
import './App.css';
function App() {
return (
<div className="App">
<FileUpload />
</div >
);
}
export default App;
通过运行启动react应用程序npm start
。
更多信息:React 文件上传演示