node学习笔记(23)-multer的文件上传数据库与下载
node
文件上传(服务器与数据库
)与下载
- 我们之前已经学习过使用
multer
插件来进行文件的拆分上传到服务器上,现在我我们就来学习一下multer
插件的另一种模式 —上传文件到数据库
以及如何从数据库中将该文件下载下来 - multer中间件的在官方文档
使用multer
将数据上传到数据库
首先我们需要一个数据库,这里使用的是
MySQL
,我们建一张表,表中的字段设置如下:- 连接数据库
/* ------------------------- 数据库操作 ------------------------------ */
const mysql = require('mysql2') //引入mysql2模块用于操作数据库
const db = mysql.createPool({ //创建连接池
host: '127.0.0.1', // 数据库域名
user: 'root', // 数据库账号
password: 'Zpl13189417387', // 数据库密码
database: 'node_upload_download1' // 连接的数据库名称
})
module.exports = db // 将连接池暴露出去
随后在
node
中下载引入multer
下载
multer
npm i multer
在文件中引入
const multer = require('multer')//引入multer中间件处理文件
const storage = multer.memoryStorage()// 使用磁盘存储模式将数据存储到数据库中
const upload = multer({ storage: storage,fileFilter})
// 设置一个方法用于对前端页面上传文件的文件名作中文转码
function fileFilter(req, file, callback) {
// 解决中文名乱码的问题
file.originalname = Buffer.from(file.originalname, "latin1").toString(
"utf8"
);
callback(null, true);
}- 在前端设置
form表单上传
<body>
<input type="file" id="file" /><br><br>
<div>
当前数据库中的文件数据为:
<table border="2">
<tbody></tbody>
</table>
</div>
<!-- 引入axios用于发送网络请求 -->
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.26.1/axios.min.js"></script>
<script>
// 文件上传
const file = document.getElementById('file')
axios.defaults.baseURL = 'http://127.0.0.1:3000'//设置请求url本体
file.addEventListener('change', async (e) => {//监听上传事件
const formDate = new FormData()
formDate.append('file', e.target.files[0])//在form表单中添加一个字段file同时将该字段赋予上传的文件数据
const { data: res } = await axios.post('/file', formDate, {
// 因为axios默认的Content-Type 为json,所以需要修改
headers: {
'Content-Type': 'multipart/form-data'
}
})
console.log(res)
})
// 文件展示以及下载:
// 获取展示列表
var tbody = document.querySelector('tbody')
// 页面一上来就获取数据库中的用户信息
axios.get('/getFileData').then(res=>{
var data = res.data.data
console.log('数据库中的所有文件数据:',res.data.data);
// 将获取到的数据填入到tbody中
tbody.innerHTML = data.map(item=>`
<tr>
<td>${item.id}</td>
<td>${item.name}</td>
<td><a href="http://127.0.0.1:3000/dw?id=${item.id}" download=""">下载</a></td>
</tr>
`).join('')
})
</script>- 后端设置接口联通数据库,将前端发送过来的文件数据(
buffer二进制数据
)保存到数据库中
// 文件上传(单文件)
//upload.single():将前端页面传过来的文件数据入到multer中并以数据流的方式保存到数据库中
app.post('/file', upload.single('file'), (req, res) => {
const file = req.file
const data = {
name: file.originalname,//文件名
value: file.buffer
}
const sql = 'INSERT INTO file SET ?'
db.query(sql, data, (err, results) => {
if (err) {
return res.send(err.message)
} else {
res.send('ok')
}
})
})
结果展示:
文件下载
数据库中的
blob
文件流数据如何通过网页下载到本地,就需要先了解网页上的文件是如何下载到本地的.文件下载
是前端开发中一个常见的功能,目前主流的下载实现主要有两种:静态文件直接下载
和文件流下载
静态文件下载
: 这就是我们之前使用multer
将文件数据传到服务器上,我们可以通过浏览器的文件策略直接下载服务器上的静态资源文件。例如我们在网页上通过点击a标签
打开的excel
,word
等文件,浏览器会自动的帮我们下载这些东西。文件流下载
: 文件流下载即通过请求后端接口,接口返回blob
类型的数据,前端组装成文件后自行下载即可。一般用于数据文件的导出。 这就是我们冲数据库中下载文件的方式
现在的
web
页面文件下载的方式有多种:- 标准
URL
下载方式:- 这种方法可以通过在
web
页面中使用a标签
的herf
属性来指向文件下载的url
来下载文件,并且配置a标签
的download
属性来使页面不发生跳转下载文件,但是这种方法存在缺陷:暴露了文件的网站路径
且动态的灵活性不够
- 这种方法可以通过在
- 通过服务器端脚本向浏览器方输出二进制流的方式下载(主要使用这种方式来下载):
// express内配置http响应头数据返回给前端
res.set({
'Content-Type': 'application/x-7z-compressed',// 响应头中返回的数据类型
'Accept-Ranges': 'bytes', // 接收的数据格式(buffer二进制数据设置为字节模式)
// 返回的文件约束一般有两种值:attachment表示文件下载 inline表示文件展示在页面上
'Content-Disposition': `attachment; filename="${results[0].name}"`
})- 标准
后端接口的代码展示
// 文件下载 |
结果展示:
完整的代码展示
- 前端页面:
|
- 后端服务器
/* ---------------------- 文件上传1 ------------------------------*/ |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0许可协议。转载请注明来自 肥林の仓库