node.js 上传图片
依赖库 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 上传图片的更多相关文章
- Node.js 上传图片并保存
Node.js 上传图片并保存 依赖 package.json 文件 { "name": "demo", "version": " ...
- 上传图片到七牛云(服务端 node.js sdk)
大体思路 前端要上传图片到七牛云,需要有一个token进行授权操作,而获取这个上传的upload token(以下简称upToken),在服务端需要一定的身份校验,比如说:只有登录的vip用户才能拿到 ...
- Node.js 项目搭建
关于 本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识.本书绝不是一本“Hello World”的教程. 状态 你正在阅读的已经是本书的最终版. ...
- [读书笔记]了不起的node.js+实践(一)
环境的变化带来了技术大跃进,机遇和挑战同时到来.基于我js也没有学,只好赶鸭子上架一起学了.(>﹏<) 1.先读读书 一开始就不知死活地看<深入浅出node.js>,弄得团团转 ...
- Node.js新手教程——怎样实现文件上传功能
作者:zhanhailiang 日期:2014-11-16 本文将介绍怎样使用Node.js实现文件上传功能. 1. 初始化项目信息:npm init [root@~/wade/nodejs/node ...
- APNs功能之Node.js和Mysql应用总结
APNs功能之Node.js和Mysql应用总结 这篇文档主要是总结Node.js和Mysql的学习心得体会.当然也可以看作是此前所写的消息推送服务的续篇. 简单描述下应用背景,我们的应用需要实现苹果 ...
- node.js系列笔记之node.js初识《一》
node.js系列笔记之node.js初识<一> 一:环境说明 1.1 Linux系统CentOS 5.8 1.2 nodejs v0.10.15 1.3 nodejs源码下载地址 htt ...
- 初学node.js有感三
WebStorm下的node.js 一.回顾与继续 在前面,我们知道了node.js的基本框架和思路,在这些原生环境下我们对node.js的设计思想有了比较深刻的认识,并且具有了编写大型程 ...
- 以太坊开发DApp实战教程——用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建电商平台(一)
第一节 简介 欢迎和我们一起来用以太坊开发构建一个去中心化电商DApp!我们将用区块链.星际文件系统(IPFS).Node.js和MongoDB来构建电商平台类似淘宝的在线电商应用,卖家可以自由地出售 ...
随机推荐
- C 和 C++ 的标准库分别有自己的 locale 操作方法,C 标准库的 locale 设定函数是 setlocale(),而 C++ 标准库有 locale 类和流对象的 imbue() 方法(gcc使用zh_CN.GBK,或者zh_CN.UTF-8,VC++使用Chinese_People's Republic of China.936或者65001.)
转自:http://zyxhome.org/wp/cc-prog-lang/c-stdlib-setlocale-usage-note/ [在此向原文作者说声谢谢!若有读者看到文章转载时请写该转载地址 ...
- 【题解】BZOJ3489 A Hard RMQ problem(主席树套主席树)
[题解]A simple RMQ problem 占坑,免得咕咕咕了,争取在2h内写出代码 upd:由于博主太菜而且硬是要用指针写两个主席树,所以延后2hQAQ upd:由于博主太菜而且太懒所以他决定 ...
- 安卓3d引擎
很 多初学Android游戏开发 href="http://edu.gamfe.com/gamedev.html">游戏开发的朋友,往往会显得有些无所适从.他们经常不知道该从 ...
- tfboys——tensorflow模块学习(三)
tf.estimator模块 定义在:tensorflow/python/estimator/estimator_lib.py 估算器(Estimator): 用于处理模型的高级工具. 主要模块 ex ...
- Percona备份mysql全库及指定数据库(完整备份与增量备份)
Percona Xtrabackup备份mysql全库及指定数据库(完整备份与增量备份) Xtrabackup简介 Percona XtraBackup是开源免费的MySQL数据库热备份软件,它能对I ...
- 一个Browser的HTTP请求(一)
本文主要是分析一个简单的web服务器是如何工作的. 若有不恰当或不对之处,请指正! Tomcat和web服务器的关系 我们常说Tomcat是一个web容器,也常说用户通过浏览器向web服务器进行请求, ...
- Python学习笔记2_Python基础
一.变量(给数据起个名字) 变量是计算机内存中的一块区域,变量可以存储规定范围内的值,而且值可以改变. 1.变量的命名方法 -变量名有字母.数字.下划线组成 -不能以数字开头 -不可以使用关键字 -a ...
- django-admin 登录之后显示页面,表是否显示
如果是超级用户可以全部看到(如图),如果是普通用户,只能看到user与group 虽然实现了其功能,不过有些地方没搞懂,所以有些地方出了写的不好 ```class PermissionsMixin(m ...
- STL之map、set灵活使用
1.LA 5908/UVA1517 Tracking RFIDs 题意:给出s个传感器的位置,以及其感应范围.如果某个方向上有墙,则该方向上感应距离减1.现在有w个墙,给出p个物品的位置,问其能被几个 ...
- php 跨域 form提交 2种方法
出于安全因素考虑,直接跨域访问是不允许的,下面介绍二种跨域的方法. 一,通过php curl function curlPost($url,$params) { $postData = ''; for ...