首页 > 编程语言 >node.js:《接口实现文件的上传和下载》

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

时间:2022-10-29 15:24:44浏览次数:52  
标签:node files name req upload js let file 上传

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

上传接口:

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

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

在主文件引入模块:

//配置文件上传临时目录
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给前端预览
        })
})

测试:

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

下载接口:

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

 

标签:node,files,name,req,upload,js,let,file,上传
From: https://www.cnblogs.com/xz1005xfx/p/16838783.html

相关文章

  • react实战笔记25:jsx简介
    命名式编程 声明式编程   jsx是语法糖......
  • node.js:《路由—接口分类》
     一个项目有很多不同的接口,如果把它们都写在同个js文件中,报错或需要改会很麻烦!我们可以将接口按我们想要的规则分类出来写在路由文件中,再借助中间件用拼接的方式,将在路......
  • 如何在html中引入DPlayer.js视频播放插件,以及任何使用DPlayer.js插件
    主要用到了实现了:视频播放 、监听开始、结束、暂停、播放时间、切换视频官方文档:http://dplayer.js.org github:https://github.com/whiskyma/gulp-demo截图如下:html......
  • 使用echart js构建 折线图标
     1.echart自定义颜色线条$.get(ROOT_PATH+'/data/asset/data/aqi-beijing.json',function(data){myChart.setOption(option={title:{te......
  • react的jsx语法是怎样解析的
    首先我们来看看下面的代码import"react"from"react";constelement=(<div><div><span>1</span><span>2</span>......
  • .net mvc web api 返回 json 内容,过滤值为null的属性
    .netmvcwebapi返回json内容时,好多属性为null的没必要下发。下面看下怎么过滤值为null的属性1.响应内容(过滤前){"msg":"初始化成功!","code":"","success":true,data:nul......
  • 牛客-js面试手撕
    数组去重利用Set()returnArray.from(newSet(array))//return[...newSet(array)]filter实现returnarr.filter(function(item,index,array){returnarr......
  • node.js:中间件的使用
    node.js中间件是一种功能的封装方式,就是封装在程序中处理http请求的功能。当一个需求多地方用到时,中间件可以提高代码效率及页面简洁那么如何使用中间件呢?中间件的书写和......
  • 【JS】面向对象-继承-私有和受保护的属性和方法
    在面向对象的编程中,属性和方法分为两组:内部接口——可以通过该类的其他方法访问,但不能从外部访问的方法和属性。外部接口——也可以从类的外部访问的方法和......
  • js一
    浏览器API文档对象模型API:DOM(DocumentObjectModel)API,能通过创建,修改,移除HTML,为页面动态应用新样式等手段来操作HTML和CSS;地理位置API(GeolocationAPI)获取地理信息......