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