Node.js 实现图片上传压缩

npm下载 响应的组件:

        formidable images fs

下面为封装好的文件,在别处调用

/**
 * 载入公用函数库
 */
// 路径管理
const path = require('path');
// 定义程序根目录
const appPath = path.resolve();
//表单
const formidable = require('formidable');
//图片压缩
const images = require('images');
// 文件管理
const fs = require('fs');


/**
 * 载入私用函数库
 */
// 日志处理
const log = require(appPath + '/utils/log');
// 私有封装函数
const fn = require(appPath + '/utils/function');

/**
 * 获取文件上传的图片路径
* @param {object}req
 * @param {object}res
 * @returns {object} return:文件对象路径
 */
function imageFilePath(req, res) {

    // log.ger('info', req);
    // log.ger('info', res);

    //实例化formidable
    var form = new formidable.IncomingForm();
    //使上传的文件保持原来的文件的扩展名
    form.keepExtensions = true;
    form.multiples = true;
    //指定文件上传的路径 
    form.uploadDir = path.join(appPath + '/', "imageFilePath");
    // 异步捕获处理后的文件名
    return new Promise((resolve, reject) => {
        //转换请求中表单中的数据
        form.parse(req, function (err, fields, files) {
            if (err) {
                //抛出错误
                throw err;
            }
            log.ger('info', '图片上传后的路径--------------------------------------------:');
            log.ger('info', JSON.stringify(files.image.path));
            resolve(files.image.path)
        })
    })
};

/**
 * 处理图片文件压缩
 * @param {object} pathFileName {}图片所在路径
 * @param {int} size 等比缩放图像到多少像素
 * @param {int} quality 图片质量为多少
 * @returns {object} returns 
 */
function explorer(pathFileName, size, quality) {
    log.ger('info', '路径----------' + pathFileName);
    // log.ger('info', fs.readFileSync(pathFileName + "123"));

    try {
        fs.readFileSync(pathFileName);
        if (!size) {
            images(pathFileName)
            .save(appPath + '/imageFilePath/' + fn.timeStamp() + ".jpg", { //Save the image to a file,whih quality 50
                quality: quality //保存图片到文件,图片质量为50
            });
        }else{
            images(pathFileName)
            .size(size)
            .save(appPath + '/imageFilePath/' + fn.timeStamp() + ".jpg", { //Save the image to a file,whih quality 50
                quality: quality //保存图片到文件,图片质量为50
            });
        }
        return appPath + '/imageFilePath/' + fn.timeStamp() + ".jpg";
        // let fileName = pathFileName.split("\\");
        // log.ger('info', '路径----------' + fileName);



    } catch (error) {
        log.ger('info', error);
        return "error"
    }



    // fs.readdir(path, function (err, files) {
    //     //err 为错误 , files 文件名列表包含文件夹与文件
    //     if (err) {
    //         console.log('error:\n' + err);
    //         return;
    //     }

    //     files.forEach(function (file) {
    //         fs.stat(path + '/' + file, function (err, stat) {
    //             if (err) { console.log(err); return; }
    //             if (stat.isDirectory()) {
    //                 // 如果是文件夹遍历
    //                 explorer(path + '/' + file);
    //             } else {
    //                 // 读出所有的文件
    //                 console.log('文件名:' + path + '/' + file);
    //                 var name = path + '/' + file;
    //                 if (name == fileName) {
    //                     var outName = path + '/' + 'another_' + file

    //                     images(name)

    //                         .save(outName, { //Save the image to a file,whih quality 50
    //                             quality: 60 //保存图片到文件,图片质量为50
    //                         });
    //                 }
    //             }
    //         });

    //     });

    // });
}


/**
 * 对外出口配置
 * 
 */
module.exports = {
    imageFilePath,
    explorer
}

在别处直接引入调用

let enter = async function (request, response) {
    // 使用过滤器验证数据头和数据类型
    let VHDData = await ft.VUD(request, response, filterData = { "headers": "multipart/form-data", "token": false, });
    if (VHDData.state == 0) {
        switch (VHDData.type) {
            case "imageCompression":
                //文件上传
                let filePath = await imageCompression.imageFilePath(request, response);
                // //压缩图片
                let newFile = await imageCompression.explorer(filePath, 100, 10);
                //返回结果
                res.send(request, response, msg.type("ok", "ok",newFile));
                break;

            default:
                break;
        }
    }
}

// 导出接口
module.exports = { enter };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值