使用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.js:《接口实现文件的上传和下载》的更多相关文章

  1. Node + js实现大文件分片上传基本原理及实践(一)

    _ 阅读目录 一:什么是分片上传? 二:理解Blob对象中的slice方法对文件进行分割及其他知识点 三. 使用 spark-md5 生成 md5文件 四. 使用koa+js实现大文件分片上传实践 回 ...

  2. SpringMVC+Ajax实现文件批量上传和下载功能实例代码

    需求: 文件批量上传,支持断点续传. 文件批量下载,支持断点续传. 使用JS能够实现批量下载,能够提供接口从指定url中下载文件并保存在本地指定路径中. 服务器不需要打包. 支持大文件断点下载.比如下 ...

  3. java web(四):request、response一些用法和文件的上传和下载

    上一篇讲了ServletContent.ServletCOnfig.HTTPSession.request.response几个对象的生命周期.作用范围和一些用法.今天通过一个小项目运用这些知识.简单 ...

  4. 步步为营-70-asp.net简单练习(文件的上传和下载)

    大文件的上传一般通过FTP协议,而一般小的文件可以通过http协议来完成 1 通过asp.net 完成图片的上传 1.1 创建html页面 注意:1 method="post" ; ...

  5. Spring MVC 实现文件的上传和下载

    前些天一位江苏经贸的学弟跟我留言问了我这样一个问题:“用什么技术来实现一般网页上文件的上传和下载?是框架还是Java中的IO流”.我回复他说:“使用Spring MVC框架可以做到这一点,因为Spri ...

  6. 文件的上传和下载--SpringMVC

    文件的上传和下载是项目开发中最常用的功能,例如图片的上传和下载.邮件附件的上传和下载等. 接下来,将对Spring MVC环境中文件的上传和下载进行详细的讲解. 一.文件上传 多数文件上传都是通过表单 ...

  7. Javaweb之文件的上传与下载

    Javaweb之文件的上传与下载 一.基于表单的文件上传 如果在表单中使用表单元素 <input type=“file” />,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可 ...

  8. JSP文件的上传和下载

    文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...

  9. java实现ftp文件的上传与下载

    最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...

随机推荐

  1. CF383C Propagating tree (线段树,欧拉序)

    \(tag\)没开够\(WA\)了一发... 求出\(dfs\)序,然后按深度分类更新与查询. #include <iostream> #include <cstdio> #i ...

  2. ceph 009 管理定义crushmap 故障域

    管理和自定义crushmap 定义pg到osd的映射关系 通过crush算法使三副本映射到理想的主机或者机架 更改故障域提高可靠性 pg到osd映射由crush实现 下载时需要将对象从osd搜索到,组 ...

  3. tty的crash分析

    crash> btPID: 410629 TASK: ffff883fea379fa0 CPU: 10 COMMAND: "jupyter-lab"#0 [ffff8823c ...

  4. KubeEdge:下一代云原生边缘设备管理标准DMI的设计与实现

    摘要:KubeEdge设备管理架构的设计实现,有效帮助用户处理设备数字孪生进程中遇到的场景. 本文分享自华为云社区<KubeEdge:下一代云原生边缘设备管理标准DMI的设计与实现>. 随 ...

  5. 1.1_selenium+Python自动化测试大纲

  6. 【JDBC】学习路径2-编写第一个JDBC程序

    第一章:导入jar包 在未安装MySQL数据库的请务必安装,安装教程:[MySQL]从入门到掌握2-下载安装 connector/J下载地址:https://dev.mysql.com/downloa ...

  7. 【Java】学习路径60-利用TCP协议接收多个客户端的数据

    import java.io.IOException; import java.net.*; public class TCP_Server { public static void main(Str ...

  8. KingbaseES V8R6 集群环境wal日志清理

    案例说明: 1.对于集群中的wal日志,除了需要在备库执行recovery外,在集群主备切换(switchover或failover)时,sys_rewind都要读取wal日志,将数据库恢复到一致性状 ...

  9. KingbaseES rownum 与 limit 的 执行计划区别

    数据准备 --创建基础数据表100W行 create table test07 as select * from (select generate_series(1, 1000000) id, (ra ...

  10. 【Vue学习笔记】—— vue的基础语法 { }

    学习笔记 作者:oMing vue v-on: 简称 @ <div id='app'> <button v-on:click='Show1'> </button> ...