node.js:《接口实现文件的上传和下载》
<h2>使用node.js写上传文件和下载文件的接口</h2><h3><strong>上传接口:</strong></h3>
<p>开始写接口前,我们先安装一个上传文件的插件:<strong>npm install multer</strong></p>
<p>安装成功在package.json或package-lock.json包中能看到</p>
<p><img src="https://img2022.cnblogs.com/blog/2533283/202210/2533283-20221029144132886-1064700844.png"></p>
<p>在主文件引入模块:</p>
<pre class="language-javascript highlighter-hljs"><code>//配置文件上传临时目录
const upload = multer({
dest:'./public/upload/temp'//临时存放路径
})</code></pre>
<p>配置所有接口可下载</p>
<pre class="language-javascript highlighter-hljs"><code>//设置所有接口都允许上传功能
uploadFile.use(upload.any())</code></pre>
<p>然后在路由中引入fs模块,写一个上传功能的接口</p>
<pre class="language-javascript highlighter-hljs"><code>const fs = require("fs");//重新定义文件模块
router.post('/upload', (req, res) => {
//检查是否有文件
if (!req.files) {//如果req是空 返回400
res.send({
code: 400,
msg: '上传文件不能为空',
});
return;
}
//保存文件
let files = req.files; //将获取的文件放到files
let ret_files = []; //定义一个空数组
for (let file of files) {//将files循环成单个
//获取名字后缀
let file_ext = file.originalname.substring(file.originalname.lastIndexOf('.') + 1);
//将文件名改为时间戳
let file_name = new Date().getTime() + '.' + file_ext
//移动文件并且修改文件名字
fs.renameSync(
process.cwd() + "/public/upload/temp/" + file.filename,//file.filename:文件最初名字/public/upload/temp/作为中转站
process.cwd() + "/public/upload/" + file_name, //file_name:时间戳新起的名字
);
//将改完的文件写进空数组
ret_files.push("./public/upload/" + file_name)
}
res.send({
code: 200,
msg: 'OK',
data: ret_files //返回data给前端预览
})
})</code></pre>
<p>测试:</p>
<p><img src="https://img2022.cnblogs.com/blog/2533283/202210/2533283-20221029145434333-539991256.png"></p>
<p>在“/public/upload/”下可以看到一个已经有一个以时间戳命名的文件了</p>
<p><img src="https://img2022.cnblogs.com/blog/2533283/202210/2533283-20221029145626216-1353595464.png"></p>
<h4>下载接口:</h4>
<pre class="language-javascript highlighter-hljs"><code>//下载接口
router.get('/download',async(req,res)=>{
let file_name = req.query.file_name;
let file_path = process.cwd()+'/public/upload/'+file_name;
res.download(file_path);
})</code></pre>
<p>完整代码:</p>
<p><span style="font-size: 16px"><strong><span style="color: rgba(52, 73, 94, 1)">uploadFile.js</span></strong></span></p>
<pre class="language-javascript highlighter-hljs"><code>constexpress = require('express')//引入模块
const uploadFile = express()//实例化
const multer = require('multer')//引入实例化上传文件模块
const port = 8080 //端口
//配置文件上传临时目录
const upload = multer({
dest:'./public/upload/temp'//临时存放路径
})
//设置所有接口都允许上传功能
uploadFile.use(upload.any())
//引入路由--接入其他接口
uploadFile.use('/route',require("./router/fileRouter"))//通过路由的方式将上传和下载接口引入
//监听
uploadFile.listen(port, () => {
//监听成功打印以下语句
console.log(`Example app listening on port ${port}`)
})</code></pre>
<h4><span style="color: rgba(52, 73, 94, 1)"> fileRouter.js:</span></h4>
<pre class="language-javascript highlighter-hljs"><code>const express = require("express");
const fs = require("fs");
var router = express.Router();
//post请求 写个接口测试一下路由会不会报错
// router.post('/test',function(req,res){
// // res.send(req.body)
// res.send('ok')
// })
//写上传接口
router.post('/upload', (req, res) => {
//检查是否有文件
if (!req.files) {//如果req是空 返回400
res.send({
code: 400,
msg: '上传文件不能为空',
});
return;
}
//保存文件
let files = req.files; //将获取的文件放到files
let ret_files = []; //定义一个空数组
for (let file of files) {//将files循环成单个
//获取名字后缀
let file_ext = file.originalname.substring(file.originalname.lastIndexOf('.') + 1);
//将文件名改为时间戳
let file_name = new Date().getTime() + '.' + file_ext
//移动文件并且修改文件名字
fs.renameSync(
process.cwd() + "/public/upload/temp/" + file.filename,//file.filename:文件最初名字
process.cwd() + "/public/upload/" + file_name, //file_name:时间戳新起的名字
);
//将改完的文件写进空数组
ret_files.push("./public/upload/" + file_name)
}
res.send({
code: 200,
msg: 'OK',
data: ret_files //返回data给前端预览
})
})
//下载接口
router.get('/download',async(req,res)=>{
let file_name = req.query.file_name;
let file_path = process.cwd()+'/public/upload/'+file_name;
res.download(file_path);
})
//3、把它加到模块上
module.exports = router;</code></pre>
<p> </p>
<p><span style="font-size: 15px"><strong>😜喜欢文章或文章内容对您有帮助点个赞鼓励一下吧~</strong></span></p><br><br>
来源:https://www.cnblogs.com/xz1005xfx/p/16838783.html
頁:
[1]