在 Node(Express)中上传或下载文件
在前端页面上传文件表单时,设置一个文件上传器(将输入文本类型设置为file):
<input type="file" name="image" id="image" />
Multer
纯文本可以使用
body-parser:const bodyParser = require("body-parser"); app.use(bodyParser.urlencoded({ extended: false })); // 使用urlencoded解析器解析传入请求体,要求传入的数据为文本数据
由于文件不是纯文本,而是二进制数据,我们需要下载一个文件请求解析中间件——multer来识别上传的文件:
npm install --save multer
multer能解析文件请求数据,能够处理文件请求或文本和文件混合的请求数据。
发送文件数据
需要在客户端发送表单数据的时候添加
enctype来选择发送解析的数据类型:<form action="/profile" method="post" enctype="multipart/form-data"> <input type="file" name="image" id="image" /> </form>multipart/form-data:请求不包含纯文本,而是包含文本和二进制的混合数据。
获取发送的文件数据
引入
multer,将其注册为中间件:const express = require("express"); const multer = require("multer"); const app = express(); app.use(multer().single("image")); // 获取一个文件,文件名为name中的名字 @1@1:multer 必须作为一个执行函数注册,它可以调用其他的方法来设置获取文件的形式(如单个文件或多个文件)。
获取上传的文件数据:
app.post("/add-product", postAddProduct);exports.postAddProduct = (req, res, next) => { const imageUrl = req.file; // req.file中获取文件数据信息 @2 };@2:它会返回一个 buffer 的混合数据流,我们可以设置它为一个图片结构(图片名为没有文件扩展名的随机的哈希名称,添加扩展名可以恢复图片):
app.use(multer({ dest: "images" }).single("image"));
存储文件数据
设置存储引擎:
diskStorage()是 multer 的存储引擎,它可以通过传递一个 JS 对象来配置,他需要两个 key:- destination:存储位置(存储文件路径);
- filename:存储名字
const fileStorage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, "images"); }, filename: (req, file, cb) => { cb(null, file.filename + "-" + file.originalname); }, }); app.use(multer({ storage: fileStorage }).single("image"));这样文件就会以指定的名字存储到指定的路径文件中。