終於搞定使用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 ?