node.js下的图片压缩处理方法。

试用了好几个中间件,本地测试没有问题,放到服务器环境下,就不适应。
特此记录。

1 安装GraphicsMagick 模块

无论是window本地还是服务器端,都需要安装。
下载页面:GraphicsMagick
下载完成后,下一步下一步安装到C盘的programs目录下。

然后配置环境变量,将软件目录配置到环境变量。

然后重启电脑才行。

2、在项目下面安装gm包。

npm install gm

3、处理上传图片文件的操作。

示例:upload.controller.js

'use strict';
/**
 * 上传文件控制层
 */
var _ = require('lodash');
var mongoose = require('mongoose');
var path = require('path');
var config = require('../config');
var path = require("path");
var formidable = require("formidable");
var fs = require('fs');
var gm = require('gm');


function isFormData(req) {
  let type = req.headers["content-type"] || "";
  return type.includes("multipart/form-data");
}
// 上传图片
exports.uploadPic = function (req,res,next) {
  if (!isFormData(req)) {
    return res
      .status(500)
      .send({
        status: 0,
        err_message: "错误的请求, 请用multipart/form-data格式"
      });
  }
  var form = new formidable.IncomingForm();
  let uploadDir = path.join(__dirname, "../tmp");
  form.uploadDir = uploadDir; // 上传目录
  form.keepExtensions = true; // 保留后缀
  form.maxFileSize = 20 * 1024 * 1024; //文件大小20M
  form.type = true;


  form.parse(req, function(err, fields, file) {
    if (err) {
      return res.status(500).send({status:0, err_message: '上传错误'})
    }
    var filePath = ''
    //如果提交文件的form中将上传文件的input名设置为tmpFile,就从tmpFile中取上传文件。否则取for in循环第一个上传的文件。
    if(file.temFile) {
      filePath = file.tmpFile.path;  
    } else {
      for(var key in file){  
        if( file[key].path && filePath==='' ){  
            filePath = file[key].path;  
            break;  
        }  
    }  
    }
     //文件移动的目录文件夹,不存在时创建目标文件夹  
     var targetDir = path.join(__dirname, '../public/uploads/');  
     if (!fs.existsSync(targetDir)) {  
         fs.mkdir(targetDir);  
     }  
    var fileExt = filePath.substring(filePath.lastIndexOf('.'));  
       //判断文件类型是否允许上传  
       if (('.jpg.jpeg.png.gif').indexOf(fileExt.toLowerCase()) === -1) {  
        var err = new Error('此文件类型不允许上传');  
        res.send({status:0, message:'此文件类型不允许上传'});  
    } else {  
        //以当前时间戳对上传文件进行重命名  
        var fileName = new Date().getTime() + fileExt;  
        var targetFile = path.join(targetDir, fileName);
        gm(filePath).resize(1200).write(targetFile, function(err){
          if(!err) {
            var fileUrl = '/uploads/' + fileName;
            fs.unlinkSync(filePath)
            res.send({status:1, data:fileUrl});  
          } else{
            // console.log(err)
            res.send({status:0, err_message:err.toString()});  
          }
        })
    }  
  });
}
// 上传图片
exports.deletePic = function(req,res,next) {
  if(!req.body.name || req.body.name == ''){
    return res.status(422).send({error_msg:"删除文件名称不能为空"});
  }
  var pathDir = path.join(__dirname, '../public/uploads/');
  try {
    fs.unlinkSync(pathDir + req.body.name)
    res.status(200).send({
      status: 1,
      message: "删除文件成功"
    })
  } catch(err) {
    res.status(500).send({
      status: 0,
      err_message: "删除文件失败"
    })
  }
}

PS:
linux下面安装GraphicsMagickhttps://blog.csdn.net/liudihedy/article/details/73238476

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值