依赖库 connect,gm,imagemagick,image-size

connect:中间件

gm,imagemagick:用来处理图片如缩放、切割、添加文字水印等

image-szie:获取图片的宽高

图片上传处理服务,保存server.js

var http = require("http");
var connect = require("connect");
var url = require("url");
var fs = require("fs");

var imagesize = require("image-size");
var gm = require("gm");
var imageMagick = gm.subClass({imageMagick: true});

var oldImgName;
var app = connect().use(function(req, res, next){
var list = [];
var len = 0;
var pathName = url.parse(req.url).pathname;
pathName = pathName.substring(1, pathName.length);
oldImgName = req.headers.imgname;
req.on("error", function(err){
console.log(err);
});
req.on("data", function(chunk){
list.push(chunk);
len += chunk.length;
});
req.on("end", function(){
var buf = Buffer.concat(list, len);
req.data = {"path": pathName, "buf": buf};
next();
});
}).use(function(req, res, next){
if(req.data.path === "upload" && oldImgName){
fs.writeFileSync("./img/new_"+oldImgName, req.data.buf);

//取图片宽高
var imageInfo = imagesize("./img/new_"+oldImgName);
console.log(imageInfo.width, imageInfo.height);

//打印水印
var imgM = imageMagick("./img/new_"+oldImgName);
imgM.fill("blue");
imgM.fontSize(30);
imgM.drawText(100, 100, Date.now().toString());
imgM.write("./img/new_"+oldImgName, function(err){
if(err){
console.log(err);
}
});

//图片切割
var imgM2 = imageMagick("./img/new_"+oldImgName);
imgM2.crop(300, 300, 0, 0);//做切割
imgM2.write("./img/new_mid_"+oldImgName, function(err){
if(err){
console.log(err);
}
});

fs.writeFileSync("./img/new_min_"+oldImgName, req.data.buf);
var imgM_min = imageMagick("./img/new_min_"+oldImgName);
//imgM_min(“img.png”).crop(width, height, x, y)//做切割
//!=强制缩放
imgM_min.resize(200, 200, "!").autoOrient().write("./img/new_min_"+oldImgName, function(err){
if(err){
console.log(err);
}
});
}
next();
}).use(function(req, res){
res.writeHead(200, {"Content-Type": "text/plain; charset=UTF-8"});
res.write("ending");
res.end();
});

http.createServer(app).listen(7650);
console.log("start....." + 7650);

客户端请求保存代码test.js

var http = require("http");
var fs = require("fs");

var imgPath = "./12306.jpg";

var data = fs.readFileSync(imgPath);

var options = {
"hostname": "127.0.0.1",
"port":7650,
"path":"/upload",
"method":"post",
"headers":{
"Content-Type":"application/octet-stream",
"imgName":"12306.jpg"
}
};
var req = http.request(options, function(res){
res.on('data', function (chunk){
if(res.statusCode != 200){
console.log("reqest error");
}else{
console.log(chunk.toString());
}
});
});
req.write(data);
req.end();

node.js 上传图片的更多相关文章

  1. Node.js 上传图片并保存

    Node.js 上传图片并保存 依赖 package.json 文件 { "name": "demo", "version": " ...

  2. 上传图片到七牛云(服务端 node.js sdk)

    大体思路 前端要上传图片到七牛云,需要有一个token进行授权操作,而获取这个上传的upload token(以下简称upToken),在服务端需要一定的身份校验,比如说:只有登录的vip用户才能拿到 ...

  3. Node.js 项目搭建

    关于 本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识.本书绝不是一本“Hello World”的教程. 状态 你正在阅读的已经是本书的最终版. ...

  4. [读书笔记]了不起的node.js+实践(一)

    环境的变化带来了技术大跃进,机遇和挑战同时到来.基于我js也没有学,只好赶鸭子上架一起学了.(>﹏<) 1.先读读书 一开始就不知死活地看<深入浅出node.js>,弄得团团转 ...

  5. Node.js新手教程——怎样实现文件上传功能

    作者:zhanhailiang 日期:2014-11-16 本文将介绍怎样使用Node.js实现文件上传功能. 1. 初始化项目信息:npm init [root@~/wade/nodejs/node ...

  6. APNs功能之Node.js和Mysql应用总结

    APNs功能之Node.js和Mysql应用总结 这篇文档主要是总结Node.js和Mysql的学习心得体会.当然也可以看作是此前所写的消息推送服务的续篇. 简单描述下应用背景,我们的应用需要实现苹果 ...

  7. node.js系列笔记之node.js初识《一》

    node.js系列笔记之node.js初识<一> 一:环境说明 1.1 Linux系统CentOS 5.8 1.2 nodejs v0.10.15 1.3 nodejs源码下载地址 htt ...

  8. 初学node.js有感三

    WebStorm下的node.js 一.回顾与继续       在前面,我们知道了node.js的基本框架和思路,在这些原生环境下我们对node.js的设计思想有了比较深刻的认识,并且具有了编写大型程 ...

  9. 以太坊开发DApp实战教程——用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建电商平台(一)

    第一节 简介 欢迎和我们一起来用以太坊开发构建一个去中心化电商DApp!我们将用区块链.星际文件系统(IPFS).Node.js和MongoDB来构建电商平台类似淘宝的在线电商应用,卖家可以自由地出售 ...

随机推荐

  1. java NIO 模型(一)

    1. 阻塞I/O通信模型 1.性能:一连接一线程模型导致服务端的并发接入数和系统吞吐量受到极大限制 2.可靠性:由于IO操作采用同步阻塞模式,当网络拥塞或者逻辑处理缓慢会导致IO线程被挂住,阻塞时间无 ...

  2. 安装和使用jupyter

    安装 pip install jupyter 使用 jupyter notebook

  3. django内容总结

    一.django请求的生命周期 1.django请求生命周期如图所示 2.django本身没有socket,客户端请求先到达wsgi然后再提交给django,而wsgi的本质就是个socket程序 注 ...

  4. 源码编译搭建LAMP

    环境版本信息: RHEL 5.3 Apache / 2.4.16 PHP / 5.4.45 mysql-5.5.45 源代码编译 安装方式 1: configure 配置 以及定制我们的软件包 2: ...

  5. Protobuf支持 pointf

    Protobuf支持 pointf序列化 加入:ProtoBuf.Meta.RuntimeTypeModel.Default.Add(typeof(System.Drawing.PointF), fa ...

  6. 联合文件系统 unionfs

  7. tar软件安装

    安装tar   ./configure   make   sudo make install

  8. PHP实现生成唯一编号(36进制的不重复编号)

    当我们要将一个庞大的数据进行编号时,而编号有位数限制,比如5位的车牌号.10位的某证件号码.订单流水号.短网址等等,我们可以使用36进制计算出符合位数的不重复的编号. 我们将0-Z(012345678 ...

  9. SPOJ - HORRIBLE 【线段树】

    思路 线段树 区间更新 模板题 注意数据范围 AC代码 #include <cstdio> #include <cstring> #include <ctype.h> ...

  10. Loadrunder脚本篇——Run-time Settings之Browser Enmulation

    浏览器模拟 所有Internet Vuser Header包含一个标识将被模拟的浏览器类型(或无线工具包)的User Agent header.例如User-Agent: Mozilla/3.01Go ...