feng xiaohan

在 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"));
    

    这样文件就会以指定的名字存储到指定的路径文件中。