1. 程式人生 > >終於搞定使用node.js +redis 作為服務端,提供圖片上傳儲存服務

終於搞定使用node.js +redis 作為服務端,提供圖片上傳儲存服務

系統不提供業務層面上的邏輯,只負責儲存和結構關係。業務相關的資料,全部通過引數化傳入。

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){});
			
			//刪除redis
			delItemFromRedisList(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);
	}
	else
	res.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 作為服務提供圖片儲存服務

系統不提供業務層面上的邏輯,只負責儲存和結構關係。業務相關的資料,全部通過引數化傳入。 upload.js 檔案程式碼: //自定義引數區 var basePath='e:/';//上傳的根路徑 var tempPath='c:/'; var redis_ip='127.0

一行命令node.js 版本升級

node有一個模組叫 n ,是專門用來管理node.js的版本的。 首先安裝n模組: npm install -g n 第二步: 升級node.js到最新穩定版 n stable 是

7天Node.js微信公眾號

課程地址 www.icourse8.com/h-pd-323.html#_pp=2_323 第1章 前期準備 第2章 實戰入門 第3章 微信流程及技術串講 第4章 實戰進階 第5章 實戰互動 第6章 實戰電影公眾號

終於無參“動態呼叫WebService方法”其實很簡單大家還是要有信心還是要有琢磨的精神。

終於搞定“動態呼叫WebService方法”: 我在學習 動態呼叫WebService方法時看到很多網友在呼叫函式(其實往往是“無參”函式)時得到一個錯誤: 未將物件引用設定到物件的例項。 這個錯誤很常見,貌似不好處理,沒明白的人不知所云,所以這裡提醒我們自己:凡是

node.js中關於使用formidable模組實現檔案至指定目錄的問題

在不指定上傳目錄的情況下: 我的window系統下是預設上傳到了C:\Users\Administrator\AppData\Local\Temp目錄下。 解決辦法: 在express較早的版本中 Express 3 裡的express.bodyParser 相當於

客戶的文件服務服務器返回文件的路徑

ech echo return post error arr var urn top 客戶端的文件上傳到服務器,服務器返回文件的路徑 返回信息,客戶端將文件保存 客戶端: <?php header(‘content-type:text/html;charset=

微信調取相冊和攝像頭實現圖片到本地服務

配置 epic 替換 pan source 工具 alert 調試 family 在微信公眾號網頁開發時,遇到了圖片上傳的問題,查看了微信的開發者文檔,裏面的資料比較全。接著我們看一下整個的流程 1、config權限配置 $.ajax({ url:‘wx_getC

使用canvas給圖片添加水印 canvas轉換base64,,canvas圖片base64等轉換成二進制文檔流的方法並將合成的圖片服務器,

web don 可能 work box rac return ros font 一,前端合成帶水印的圖片 一般來說,生成帶水印的圖片由後端生成,但不乏有時候需要前端來處理。當然,前端處理圖片一般不建議,一方面js的處理圖片的方法不全,二是有些老版本的瀏覽器對canvas

java TCP通信 socket 套接字 用圖片轟炸服務

ack 服務器 dclient write tcp public AI 套接字 dcl 客戶端 package com.swift.jinji; import java.io.FileInputStream; import java.io.IOException; im

web服務安全---文件漏洞

業務 舉例 不可 用戶 改變 一點 web容器 ash bsh 1、簡述   文件上傳漏洞是指用戶上傳了一個可執行的腳本文件,並通過此腳本文件獲得了執行服務端命令的能力。這種攻擊方式是最直接和有效的,而且互聯網中我們經常會用到文件上傳功能,它本身是沒有問題的,正常的業務需求

Nuxt.js vue-quill-editor 圖片 儲存

1. 安裝vue-quill-editor (Git地址) npm install vue-quill-editor --save   2. 在Nuxt.js框架中配置 plugins資料夾中新建:vue-quill-editor.js import Vue from 'v

PhpStorm連接服務開始自動功能

轉載 *** 們的 ftp exc ctrl 項目 失敗 .net 連接服務器 菜單欄找到【工具/Tools】->【Deployment/部署】->【Confinguration…/配置…】。 點加號(+),添加一臺服務器,填寫名稱,選擇類型為SFT

利用阿里雲 OSS 服務為 sublime 提供自動圖片圖片的外掛

OSS 的相關操作 雲物件儲存服務(Object Storage Service,簡稱 OSS),能夠提供的海量、安全、低成本、高可靠的雲端儲存服務。通俗的講就是一個『網路上的大硬碟』,你可以通過自己寫程式碼進行讀寫、訪問控制等操作。 物件儲存的概念 視訊播放,這裡會介紹圖床只是

phpstorm連接服務實時編輯文件到服務

配置 刪除 img strong nbsp ont 老版本 進行 text 教程一:我的老版本,並且是漢化的,找到該位置 打開後:點擊Configuration進行配置! 輸入服務器的ip、端口、用戶名、密碼即可 打開編輯: 教程二:下面更新了一個新版本的

微信小程式開發之圖片+Java服務接收 好不好使有待確認

閒言少敘直入正題存放路徑:/root/apache-tomcat-8.5.30/webapps/images/xxx.jpg前端程式碼在網上一搜一大堆,且搜出來的結果基本上是正確的,沒啥好說的,我連程式碼都不想貼(如果有時間的話明天整理下貼在文章結尾,沒時間的話就不貼了)。但是,但是,但是,靠譜的,不用改動就

服務簽名後直傳(檔案到oss)

demo的環境:idea2.6+Tomcat8+vue 我這邊只是做了上傳圖片的demo,下面先看下所需依賴: jetty-servlet:9.2.10.v20150310 jetty-servlets:9.2.10.v20150310 aliyun-sdk-oss:2.

利用python+seleniumUI自動化登錄獲取cookie後再去測試接口今天終於

zsh use avatar get 獲取 mod .text 獲取cookie mob #coding=utf-8from selenium import webdriverfrom selenium.common.exceptions import NoSuchElem

node.js 核心http模塊起一個服務返回一個頁面

代碼 utf utf-8 瀏覽器渲染 設置 shee rip span 渲染 let http=require("http"); //引入核心http模塊 let fs=require("fs"); let mime={ ‘.js‘:‘applicati

Node.js熱部署代碼實現修改代碼後自動重啟服務方便實時調試

iso 用戶 使用方法 了解 super 幫助 應用 https js文件 寫PHP等腳本語言的時候,已經習慣了修改完代碼直接打開瀏覽器去查看最新的效果。而Node.js 只有在第一次引用時才會去解析腳本文件,以後都會直接訪問內存,避免重復載入,這種設計雖然有利於提高性能,

搭建Node.js Redis開發環境

() func ron 8.0 .com pan color 9.png mil 創建項目 初始化為node項目 $npm init ?安裝redis ?安裝@types/node, @types/redis, typescript ?