MySQL可以存放几乎任何类型的数据(图片、文档、压缩包等),但这不是最好的解决方案,正常情况下都是在数据库中存放文件路径,图片、音乐、视频、压缩包、文档等文件存放在硬盘上。
2018.8.4更新:
在传输文件时,multer().array()设置的字段属性应该和前端中的<input>标签的name属性一致,否则会产生错误:“unexpected field: ......”
1. 代码
index.html
1 | <!DOCTYPE html> |
server.js
1 | /** |
依赖项,package.json
1 | { |
clear.js
1 | /** |
db.js
1 | /** |
2. 思路
整体思路:在前端选择文件并上传至服务器,服务器接收文件同时删除缓存;接收文件成功后,将文件信息读取存入数据库中;删除文件时,同步删除数据库中的相关信息。
详细步骤:
首先我们需要依赖以下几个npm模块:
- express - 搭建服务器;
- mysql - 连接数据库;
- fs - 文件操作;
- body-parser - 解析post请求体;
- multer - 对
multipart/form-data编码文件解析;
然后关联两个自定义模块:clear和db,clear中包含了清除所有文件和清除所有缓存的两个方法,db则返回一个数据库连接;
1 | var clear = require('./clear'); |
在当前文件夹创建文件夹uploadFiles,文件下下创建两个子文件夹tmp和file,用来存放临时文件和接收文件。然后设置tmp为临时文件的目录:
1 | // 设置文件缓存的目录 |
接着设置应用的请求响应,需要响应四种请求:
app.get('/')- 首页请求,使用res.sendFile()把首页丢过去;app.post('/upload_file')- 上传文件请求(见下方解释);app.get('/delete_all_file')- 删除所有文件请求,调用自定义模块clear中的clearAllFile()方法,通过返回值来判断是否成功;app.get('/delete_cache')- 清除缓存请求,调用自定义模块clear中的clearCache()方法,通过返回值来判断是否成功;
2.1 文件上传详解
响应/upload_file请求,使用upload.array('file')为所有接受到的文件添加统一的字段file:
1 | app.post('/upload_file', upload.array('file'), function (req, res) { |
req.files[0]包含了文件的全部信息(由中间件upload.array(‘file’)写入的),内容如下:
1 | { |
设置文件存储位置,为当前目录uploadFiles文件夹中file字段对应的文件夹,通过设置不同字段对文件进行分类存储可以保证较好的逻辑清晰性:
1 | var des_file = __dirname + "/uploadFiles/" + req.files[0].fieldname + "/" + req.files[0].originalname; |
接下来通过读取编码文件来还原上传的文件,用到的方法如下结构:
1 | app.post('/upload_file', upload.array('file'), function (req, res) { |
2.2 自建模块clear和db
db.js文件结构简单,返回一个数据库连接,使用方法如下:
1 | var db = require('./db'); |
clear.js文件定义了两个方法:清除缓存和清除所有文件,清除所有文件除了清除磁盘文件外,还清空了数据库中的相关信息:
1 | var clearAllFile = function () { |