node.js+express使用multer实现文件上传

1、导入multer包

npm install multer --save -d

2、引用multer

var multer = require("multer");

3、处理上传文件

/**
 * 判断目录是否存在
 * @param {路径} path
 * @returns
 */
var isDirectory = function (path) {
    try {
        return fs.existsSync(path);
    } catch (e) {
        return false;
    }
};

/**
 * 文件上传过滤(图片过滤)
 * @param {*} req
 * @param {*} file
 * @param {*} cb
 */
var imageFilter = function (req, file, cb) {
    var acceptableMime = ["image/jpeg", "image/png", "image/jpg", "image/gif"];
    if (acceptableMime.indexOf(file.mimetype) !== -1) {
        cb(null, true);
    } else {
        cb(null, false);
    }
};

var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        var t = new Date();
        // 接收到文件后输出的保存路径(若不存在则需要创建)
        var directory = ;
        // 检查某个目录是否存在
        var dir = path.join(__dirname, "public", "uploads", t.getFullYear() + "-" + (t.getMonth() + 1));
        if (!isDirectory(dir)) {
            // 不存在目录,则异步创建目录
            fs.mkdir(dir, (err) => {
                if (err) return err;
                console.log("目录创建成功");
            });
        }
        cb(null, directory);
    },
    filename: function (req, file, cb) {
        // cb(null, file.originalname);
        cb(null, uuid.v1());
    },
});

var limits= {
    fields: 16, //非文件字段的数量
    fileSize: 50 * 1024 * 1024, //文件大小 50M
    files: 3, //上传文件数量
};

//方法一:
var upload = multer({
    storage: storage,
    // fileFilter: imageFilter,
    limits: limits,
}).single("avatar");

//方法二:

var upload = multer({
    storage: storage,
    // fileFilter: imageFilter,
    limits: limits,
});
//适用于多文件上传
var type = upload.array("avatar", 12);
//适用于混合模式文件上传
// var type = upload.fields([
//     { name: "avatar", maxCount: 1 },
//     { name: "photo", maxCount: 8 },
// ]);
//适用于单文件上传
// var type = upload.single("avatar");

4、使用

//方法一:
//文件上传接口
router.post("/api/file/upload", async (req, res) => {
  	upload(req, res, function (err) {
        if (err) {
            return res.send({error: err});
        } else {
            console.log(req.file);
            return res.send({ data: req.file });
        }
    });
});

//方法二:
router.post("/api/file/upload", type, async (req, res) => {
    console.log(req.files);
    return res.send({ data: req.files });
});

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值