標籤:
目標:將本人寫部落格時候的儲存到案頭的圖片
執行儲存到指定檔案進行整理
並寫入資料庫
先看最終的目錄結構:
package.json檔案:
{ "name": "zqz", "dependencies": { "mysql": "^2.10.2", "node-schedule": "^1.1.0" }}
通過npm install node-schedule --save //--save的作用是將其加入package.json的dependencies(依賴項中)
2個依賴項:
node-schedule https://github.com/node-schedule/node-schedule 定時器
mysql https://github.com/felixge/node-mysql mysql
app.js檔案:
var schedule = require(‘node-schedule‘);var mysql = require(‘mysql‘);var fs = require(‘fs‘);const desktopPath = ‘C:/Users/Administrator/Desktop/‘;const targetPath = ‘F://Blog_ScreenShot//‘;const metaInfo = ‘blog‘;var operationType = { 0 : ‘插入‘, 1 : ‘刪除‘, 2 : ‘修改‘, 3 : ‘查詢‘}/** * 輪詢案頭 * @return {[type]} [description] */function timePoll(){ console.log(‘--------[開始輪詢]----------‘) schedule.scheduleJob(‘30 * * * * *‘, function(){ visitDesk(); console.log(‘每分鐘的30s都會執行!:‘ + (new Date).toLocaleTimeString()); }); }/** * 訪問案頭 * @return {[type]} [description] */function visitDesk(){ console.log(‘--------開始訪問案頭----------‘) fs.readdir(desktopPath,function(err, files){ if (err) { return console.error(err); } files.forEach( function (file){ if(file && judgeImage(file)){ saveImageToFile(file); }else{ console.log(‘案頭無資源!‘); return; } }); });}/** * 判斷檔案類型,取出我們需要的png圖片 * @return {[type]} [description] */function judgeImage(file){ var postfix = getPostfix(file); if(postfix === ‘png‘ && file.indexOf(metaInfo) > -1){ return file; }}function getPostfix(file){ var dotIndex = file.indexOf(‘.‘); var fileLen = file.length; return file.substring(dotIndex+1,fileLen);}/** * 將擷取的圖片存入 * pipe,它以用來把當前的可讀流和另外一個可寫流串連起來。可讀流中的資料會被自動寫入到可寫流中 * @return {[type]} [description] */function saveImageToFile(file){ var fileReadStream = fs.createReadStream(desktopPath + file); var lastPath = targetPath + createDateFolder(); if(!isFolderHave(lastPath)){ createLastFloder(lastPath); } var fileWriteStream = fs.createWriteStream(lastPath + file); fileReadStream.pipe(fileWriteStream); fileWriteStream.on(‘close‘,function(){ console.log(‘複製成功!‘); deleteDeskImage(file); //寫入資料庫 connectMysql(file, lastPath, ‘0‘); })}/** * 刪除案頭檔案 * @param {[type]} file [description] * @return {[type]} [description] */function deleteDeskImage(file){ fs.unlink(desktopPath + file, function(){ console.log(‘刪除成功!‘) })}/** * 以系統時間建立檔案夾/年月日 * @return {[type]} [description] */function createDateFolder(){ var day = (new Date).getDate(); var month = (new Date).getMonth()+1; var year = (new Date).getFullYear(); return year + ‘_‘ + month + ‘_‘ + day + ‘//‘;}/** * 判斷檔案夾是否存在 * @return {[type]} [description] */function isFolderHave(lastPath){ fs.exists(lastPath, function(exists){ if(exists){ return true; }else{ return false; } })}/** * 建立最終目標檔案夾 * @param {[type]} lastPath [description] * @return {[type]} [description] */function createLastFloder(lastPath){ fs.mkdir( lastPath, function(){ console.log(‘[檔案夾建立]-‘ +lastPath + "成功!"); })}/** * 串連資料庫 * @return {[type]} [description] */function connectMysql(picname, picurl, time){ var connection = mysql.createConnection({ host : ‘localhost‘, user : ‘root‘, password : ‘root‘, database : ‘nodejs‘ }); connection.connect(function(err){ if(err){ console.log(err); return; } console.log(‘串連成功!‘); }); saveToDataBase(connection, picname, picurl); connection.end(function(err){ if(err){ return; } console.log(‘關閉串連成功!‘); });}/** * 將資料存入資料庫,進行持久化 * @return {[type]} [description] */function saveToDataBase( connection, picname, picurl){ var querySql = ‘INSERT INTO scaingDeskImg(Id,picname,picurl,time) VALUES(0,?,?,?)‘; //注意存入資料庫中的資料如果有中文會出現,亂碼錯誤,導致執行失敗! var querySql_Params = [picname, targetPath+picurl+picname, new Date]; operationDataBase( connection,querySql, querySql_Params, operationType[‘0‘]);}/** * 對資料庫的操作 * @return {[type]} [description] */function operationDataBase( connection, querySql, querySql_Params,flag){ connection.query( querySql, querySql_Params, function (err, result) { if(err){ console.log(‘[‘ + flag + ‘ERROR] - ‘,err.message); return; } console.log(flag + ‘成功!‘); });}timePoll();
結果:
涉及的知識:
定時器:
schedule.scheduleJob(‘30 * * * * *‘, function(){ visitDesk(); console.log(‘每分鐘的30s都會執行!:‘ + (new Date).toLocaleTimeString());});
定時器中的第一個參數:
秒 分 時 日 月 周
* * * * * *┬ ┬ ┬ ┬ ┬ ┬│ │ │ │ │ |│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)│ │ │ │ └───── month (1 - 12)│ │ │ └────────── day of month (1 - 31)│ │ └─────────────── hour (0 - 23)│ └──────────────────── minute (0 - 59)└───────────────────────── second (0 - 59, OPTIONAL)
例如:
30 * * * * * 就表示每分鐘的30秒執行
30 2 * * * * 就表示每小時的2分30秒執行
30 2 21 * * * 就表示每天的21點2分30秒執行
30 2 21 8 * * 就表示每月的8號21點2分30秒執行
...依次類推
讀寫檔案:
//從案頭將檔案讀入流
var fileReadStream = fs.createReadStream(desktopPath + file);
//從要存入的檔案建立寫入流
var fileWriteStream = fs.createWriteStream(lastPath + file);
//最後通過node的pipe()的方法串連兩個資料流,猶如管道一樣將資料讀入寫入
fileReadStream.pipe(fileWriteStream);
具體的可以參見API。
Node+fs+定時器(node-schedule)+MySql