這篇文章主要介紹NodeJs如何實現(xiàn)簡易WEB上傳下載服務(wù)器,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比回民網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式回民網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋回民地區(qū)。費用合理售后完善,10余年實體公司更值得信賴。項目上的需求是集群均可生成PDF文件或是訪問PDF文件,但是沒有文件服務(wù)器,故做一個簡易的文件服務(wù)器。
解決方案:集群內(nèi)的機器(客戶端)生成PDF文件之后將PDF文件推給文件服務(wù)器,我們暫且稱它為服務(wù)端;如果某個客戶端需要訪問到這個PDF文件,則去服務(wù)端獲?。ㄒ驗榭赡芷渌蛻舳艘呀?jīng)生成了該PDF文件),如果沒有找到,則自己客戶端生成PDF文件,再將PDF文件推給服務(wù)端。
為了實施簡易,現(xiàn)采取NodeJs來實現(xiàn)一個小程序。 不多說,直接上代碼:
server.js
var express = require('express'); var url = require('url'); var fs = require('fs'); var http = require('http'); var queryString = require('querystring'); var bodyParser = require('body-parser'); var path=require('path'); var app = express(); app.use(bodyParser.json({limit:'1000kb'})); app.use(bodyParser.urlencoded({limit:'1000kb',extended:true})); var count=0; app.post('/upload.node',function(req,resp){ console.log('上傳請求 '+ (new Date())); var data = new Buffer(req.body.fileData,'base64'); var filePath = req.body.filePath; var pathObj = path.parse(filePath);//對文件路徑字符串進行操作 var responseBody = {}; mkdirsSync(pathObj.dir);//遞歸創(chuàng)建文件目錄 try{ var writerStream = fs.createWriteStream(filePath); writerStream.write(data); writerStream.end(); writerStream.on('finish', function() { console.log('上傳完成 '+ (new Date())); }); writerStream.on('error', function(err){ console.log(err.stack); }); responseBody=JSON.stringify({ returnMsg:'200' }); }catch(err){ console.log('上傳出錯 '+ (new Date())); responseBody=JSON.stringify({ returnMsg:'400' }); } //寫入文件 //console.log('*** ' + count +' ***'); resp.status(200).end(responseBody.toString()); }); app.post('/download.node',function(req,resp){ console.log('下載請求 '+ (new Date())); var filePath = req.body.filePath; console.log('download'); var responseBody = {}; if(fs.existsSync(filePath)){ var data = fs.readFileSync(filePath); var dataBase64 = data.toString('base64'); responseBody = JSON.stringify({ returnMsg:'200', filePath:filePath, fileData:dataBase64 }); console.log('下載完成 '+ (new Date())); }else{ responseBody=JSON.stringify({ returnMsg:'400' }); console.log('文件未找到 '+ (new Date())); } //console.log('*** ' + ++count +' ***'); resp.status(200).end(responseBody.toString()); }); //遞歸創(chuàng)建文件目錄 同步方法 function mkdirsSync(filePath){ if(fs.existsSync(filePath)){ return true; }else{ if(mkdirsSync(path.dirname(filePath))){ fs.mkdirSync(filePath); return true; } } } var server = app.listen(20001,function(){ console.log('Server started.'); })
提供一個測試js代碼.. 瀏覽器通過get請求 http://127.0.0.1:20000/upload.do?filePath=XXXX即可觸發(fā)上傳過程
var express = require('express'); var url = require('url'); var fs = require('fs'); var http = require('http'); var queryString = require('querystring'); var bodyParser = require('body-parser'); var app = express(); app.use(bodyParser.json({limit:'1000kb'})); app.use(bodyParser.urlencoded({limit:'1000kb',extended:true})); var count=0; app.get('/upload.do',function(req,resp){ console.log('upload.do'); //var path = url.parse(req.url).pathname; //console.log('Request for ' + path); var filePath = req.query.filePath; //var fileData = req.query.fileData; var address = req.query.address; upload(filePath,'127.0.0.1',20001); console.log('*** ' + ++count +' ***'); var response = { "first":req.query.filePath, "last":req.query.address }; resp.end(JSON.stringify(response)); }); function upload(filePath,address,port){ var Data = readFile(filePath); var dataBase64 = Data.toString('base64'); console.log(Data); console.log(dataBase64); //var DataJSON = JSON.stringify(Data); //fs.writeFile('D:/input.txt',dataBase64,function(err){ // if(err){ // console.err(err); // } //}); var JsonData = queryString.stringify({ filePath:filePath, fileData:dataBase64 }); //console.log(JsonData); var options = { method: "POST", host : address, port : port, path : '/upload.node', headers: { 'Content-Type':'application/x-www-form-urlencoded' } }; var req = http.request(options, function(res){ res.setEncoding('utf8'); }); req.write(JsonData); req.end(); } function readFile(filePath){ var fileData = ''; try{ fileData = fs.readFileSync(filePath); }catch(e){ fileData = ''; } return fileData; } app.post('/download.do',function(req,resp){ //可直接參考server.js的代碼 }) var server = app.listen(20000,function(){ console.log('Server started.'); })
這僅僅是一個簡易的Nodejs程序,直接用此程序去壓測,得到結(jié)果是每秒可處理八十多個請求,基本上能滿足現(xiàn)在的需求,還有很多改進的地方,比如加入緩存,隊列....等等。
對于NodeJs本人也只是學到了一點皮毛,還有很多知識點沒去探究。大家看看就行。
以上是“NodeJs如何實現(xiàn)簡易WEB上傳下載服務(wù)器”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。