4

node.js:《接口实现文件的上传和下载》 - 小小小侠

 1 year ago
source link: https://www.cnblogs.com/xz1005xfx/p/16838783.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

使用node.js写上传文件和下载文件的接口

上传接口:

开始写接口前,我们先安装一个上传文件的插件:npm install multer

安装成功在package.json或package-lock.json包中能看到

2533283-20221029144132886-1064700844.png

在主文件引入模块:

//配置文件上传临时目录
const upload = multer({
    dest:'./public/upload/temp'//临时存放路径
})

配置所有接口可下载

//设置所有接口都允许上传功能
uploadFile.use(upload.any())

然后在路由中引入fs模块,写一个上传功能的接口

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给前端预览
        })
})
2533283-20221029145434333-539991256.png

在“/public/upload/”下可以看到一个已经有一个以时间戳命名的文件了

2533283-20221029145626216-1353595464.png

下载接口:

//下载接口
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);
})

完整代码:

uploadFile.js

const  express = 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}`)
})

 fileRouter.js:

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;

😜喜欢文章或文章内容有帮助的话留下足迹鼓励一下博主吧~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK