使用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. Linux 08 磁盘管理

    参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 概述 Linux ...

  3. 基于vue的脚手架开发与发布到npm仓库

    什么是脚手架 在项目比较多而且杂的环境下,有时候我们想统一一下各个项目技术栈或者一些插件/组件的封装习惯,但是每次从零开发一个新项目的时候,总是会重复做一些类似于复制粘贴的工作,这是一个很头疼的事情, ...

  4. C++ Protobuf

    Protobuf protobuf (protocol buffer) 是谷歌内部的混合语言数据标准.通过将结构化的数据进行序列化(串行化),用于通讯协议.数据存储等领域的语言无关.平台无关.可扩展的 ...

  5. rh358 002 fact变量获取 ansible配置网络 service_facts

    通过ansible 获取网络信息 1.如何获取fact事实变量 方式1: ansible servera -m servera 方式2: 剧本 [root@workstation ansible]# ...

  6. 【MySQL】DDL因Waiting for table metadata lock卡住

    在数据库空闲时间,对表做碎片整理: alter table my_abc engine=innodb; 发现会话被阻塞,显示状态是: Waiting for table metadata lock 手 ...

  7. SSH免密登录的配置

    ssh登录 登录ssh一般情况有两种方法 密码登录 秘钥登录(免密) 大部分情况我们选择都是输入密码登录,平常使用暂时没有遇到什么问题.最近我编写了一些使用scp来传输文件的脚本,每一次scp都需要输 ...

  8. 使用SpringCloud实现的微服务软件开发部署到Linux上占用内存过大问题解决办法

    问题描述 最近上线的一个使用JAVA的Spring Cloud开发的ERP软件,部署上线时发现很严重的内存资源占用过高问题,而实际上开发测试并没有很大的访问量,甚至却出现了服务器无法正常访问的现象. ...

  9. 【Ceph】Ceph学习理解Ceph的三种存储接口:块设备、文件系统、对象存储

    文章转载自:https://blog.51cto.com/liangchaoxi/4048519

  10. EFK-2:ElasticSearch高性能高可用架构

    转载自:https://mp.weixin.qq.com/s?__biz=MzUyNzk0NTI4MQ==&mid=2247483811&idx=1&sn=a413dea65f ...