终于搞定使用node.js +redis 作为服务端,提供图片上传存储服务
来源:互联网 发布:产品怎样做网络销售 编辑:程序博客网 时间:2024/05/29 15:55
系统不提供业务层面上的逻辑,只负责存储和结构关系。业务相关的数据,全部通过参数化传入。
upload.js 文件代码:
//自定义参数区var basePath='e:/';//上传的根路径var tempPath='c:/';var redis_ip='127.0.0.1';var redis_port=11000;var redis_dbindex=5;//系统说明://POST的时候,系统一定要传递的参数有 url,path,key,db_index//GET的时候.del=filepath,path格式/123/23/23/sdf.jpg .需要传递del,key,dbindex//----系统定义区var http = require('http');var fs=require('fs');var ps=require('path');var formidable = require('formidable');var util=require('util');var redis = require('redis');var querystring=require('querystring');var server;server = http.createServer(function(req, res) {if (req.method=='POST') {var form = new formidable.IncomingForm(),files = new Array(),File=null,fields = new Array();form.uploadDir = tempPath;form.encoding='utf-8';form.maxFieldsSize=5*1024*1024;form.keepExtensions=false;form.on('field', function(field, value) {try{fields[field]=value;}catch(e){writefalse(res,e,'onfield error');}}).on('file', function(field, file) {try{files[field]=file;File=file;}catch(e){writefalse(res,e,'onfile error!');}}).on('end', function() { try{if(fields['url'] && fields['path']&& File.size>0){if(fields['filesize'] && File.size>fields['filesize']){fs.unlink(File.path,function(err){});writefalse(res,'','文件大小超过限制!');}else{var descPath=basePath+fields['path'];mkdirs(descPath,0755,function(){var rnd=generateMixed(6);var filename=rnd+File.name.substr(File.name.lastIndexOf('.'));fs.rename(File.path, descPath+'/'+filename, function(err){ console.log(err+'');});writeRedisList(fields,filename); });res.writeHead(302,{'Location':fields['url']});res.end('0');}}else{writefalse(res,'','需要传入跳转url,path!');}}catch(e){//console.log(e);writefalse(res,e,'上传事件出错!'); }}).on('error',function(err){//console.log(err+'');writefalse(res,err,'上传文件出错!');});try{form.parse(req);}catch(e){//console.log(e);writefalse(res,e,'form.parse error');}} else if(req.method=='GET'){try{var para=querystring.parse(req.url.replace('/?',''));if(para.del && para.key){//删除文件var path=basePath+para.del;fs.unlink(path, function(err){});//删除redisdelItemFromRedisList(para.key,para.del,para.dbindex);writefalse(res,'','1');}}catch(e){writefalse(res,e,'GET 错误!');}}else {res.writeHead(404, {'content-type': 'text/html;charset=utf-8'});res.end('0');}});server.listen(8888);console.log('listening on http://localhost:'+8888+'/');function writefalse(res,e,msg){res.writeHead(200, {'content-type': 'text/html;charset=utf-8'});if(msg){res.end(msg);}elseres.end('0');console.log(''+e);}//写入redis List形式的function writeRedisList(fields,filename){try{//循环获取传过来的参数,找到redis 相关的。 var redisClient = redis.createClient(redis_port,redis_ip); redisClient.on("error", function (err) {console.log("Error " + err);return false;});if(fields['key']){var json='{';for(var s in fields){if(s.indexOf('redis_')==0 ){json +='\''+s.substr(6)+'\':\''+fields[s]+'\',';}} //console.log('filename:'+filename);if(fields['path'] && filename){json +='\'Path\':\''+fields['path']+filename+'\',';}if(json.length>1)json=json.substr(0,json.length-1);json += '}';if(fields['db_index'])redis_dbindex=fields['db_index'];redisClient.select(redis_dbindex,function(){redisClient.rpush(fields['key'], json, function(){redisClient.quit();}); });} return true;}catch(e){console.log('redis error:'+e);return false;}}//从redis里删除function delItemFromRedisList(key,path,dbindex){try{//循环获取传过来的参数,找到redis 相关的。 var redisClient = redis.createClient(redis_port,redis_ip); redisClient.on("error", function (err) {console.log("Error " + err);return false;});if(key&&path){if(dbindex)redis_dbindex=dbindex;redisClient.select(redis_dbindex,function(){redisClient.lrange(key, 0,-1, function (err, replies){replies.forEach(function (reply, i) {console.log(" " + i + ": " + reply);if(reply.indexOf(path)>-1){redisClient.lrem(key,0,reply,function(){ redisClient.quit(); });}});}); });} return true;}catch(e){console.log('redis error:'+e);return false;}}//获取N 个随机字符 function generateMixed(n) {var jschars = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']; var res = ""; for(var i = 0; i < n ; i ++) { var id = Math.ceil(Math.random()*35); res += jschars[id]; } return res;} //定义创建目录方法var mkdirs = module.exports.mkdirs = function(dirpath, mode, callback) { ps.exists(dirpath, function(exists) { if(exists) { callback(dirpath); } else { //尝试创建父目录,然后再创建当前目录 mkdirs(ps.dirname(dirpath), mode, function(){ fs.mkdir(dirpath, mode, callback); }); } });};
业务层面传入方法代码:
<form action="http://127.0.0.1/upload" method="post" enctype="multipart/form-data" name="a"><input type="file" name="f" /><input type="hidden" name="url" value="http://www.baidu.com" /><input type="hidden" name="key" value="tipboy" /><input type="hidden" name="filesize" value="1048576" /><input type="hidden" name="path" value="412/23/41/32/" /><input type="hidden" name="redis_data" value="tipboy123" /><input type="submit" name="sub" /></form>
- 终于搞定使用node.js +redis 作为服务端,提供图片上传存储服务
- node.js使用mongodb存储数据-概念篇+服务端使用
- Node.Js上传图片
- 使用Node.js和Redis实现push服务
- Node.js作为服务器的文件上传
- node.js文件图片上传
- Node.js入门---上传图片
- node.js kindeditor上传图片
- node.js上传图片小结
- 终于搞定了 django 的 ajax 方式上传图片
- 终于搞定了 django 的 ajax 方式上传图片
- Git服务搭建使用Linux作为服务端,window作为客户端
- Node.js下使用Redis
- 使用Node.js作为后台进行爬虫
- iOS中使用七牛云存储Django服务端实现简单的图片上传功能
- node.js实现多图片上传
- Node.js实现多图片上传
- node.js 用户上传图片到服务器
- 最新行政区代码(2010-12-31) SQL语句
- HashTable,HashMap和TreeMap
- MySQL关联查询优化实例
- ORACLE EBS 系统主数据管理(J)
- 解压cpio.gz文件
- 终于搞定使用node.js +redis 作为服务端,提供图片上传存储服务
- Android查询短信数据库
- 设计模式之bridge模式之(2)
- eclipse自定义类注释和方法注释
- CentOS/RHEL上通过Cacti监控mysql
- 雷锋读图:风险投资商VS创业孵化器
- flex array操作
- oralce查进程及kill
- JAVA集合小结