From 256ebb63638b4295be62b1222a6dc02b47a38cd7 Mon Sep 17 00:00:00 2001 From: life Date: Wed, 28 Jan 2015 00:38:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E6=B7=BB=E5=8A=A0=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=88=90=E5=8A=9F,=20add=20resource=20=E5=BE=85?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- node_modules/api.js | 9 ++++- node_modules/common.js | 53 +------------------------ node_modules/evt.js | 5 +++ node_modules/file.js | 83 ++++++++++++++++++++++++++++++++++++++-- node_modules/note.js | 55 +++++++++++++++++++++++++- node_modules/server.js | 1 - note.html | 7 +++- package.json | 3 +- public/js/app/service.js | 1 + public/js/common.js | 2 +- test.js | 19 +++++++-- 11 files changed, 172 insertions(+), 66 deletions(-) diff --git a/node_modules/api.js b/node_modules/api.js index 1e6ffde2..6c249376 100644 --- a/node_modules/api.js +++ b/node_modules/api.js @@ -86,13 +86,17 @@ var Api = { fs.writeFile('/Users/life/Desktop/aa.png', resp.body); }); }, + // 测试 uploadImage: function() { var data = { foo: 'bar', - image: { file: '/Users/life/Desktop/aa.png', content_type: 'image/png' } + cc: [1,2,3,3], + dd: {name: 'life', age: 18}, + image: { file: '/Users/life/Desktop/imageplus.png', content_type: 'image/png' } } needle.post('http://localhost/phpinfo.php', data, { multipart: true }, function(err, resp, body) { // needle will read the file and include it in the form-data as binary + console.log(resp.body); }); }, getSyncNotebooks: function(afterUsn, maxEntry, callback) { @@ -338,7 +342,8 @@ var Api = { }); }, - // 添加 + // 添加笔记 + // 要把文件也发送过去 addNote: function(note, callback) { var me = this; // note.NotebookId是本的, 要得到远程的 diff --git a/node_modules/common.js b/node_modules/common.js index fd9b1253..8486c6c9 100644 --- a/node_modules/common.js +++ b/node_modules/common.js @@ -1,6 +1,5 @@ var fs = require('fs'); var User = require('user'); -var File = require('file'); var Evt = require('evt'); var ObjectId = require('objectid'); @@ -35,56 +34,6 @@ var Common = { } return false; }, - // FileReaderWeb 是 web上的FileReader, 可能与nodejs这个有冲突 - pasteImage: function(event, FileReaderWeb, callback) { - var me = this; - var items = (event.clipboardData || event.originalEvent.clipboardData).items; // 可能有多个file, 找到属于图片的file - // find pasted image among pasted items - var blob; - for (var i = 0; i < items.length; i++) { - if (items[i].type.indexOf("image") === 0) { - blob = items[i].getAsFile(); - } - } - // console.log("paste images"); - // console.log(blob); - // load image if there is a pasted image - if (blob) { - // console.log("??"); - var reader = new FileReaderWeb(); - // console.log(">>") - // console.log(reader); - // console.log(">>") - reader.onloadend = function() { - console.log(reader); - // 这个事件在读取结束后,无论成功或者失败都会触发 - if (reader.error) { - console.log(reader.error); - } else { - } - } - reader.onload = function(e) { - // 上传之 - // log('result'); - // log(reader.result); - var ret = reader.result - ret = ret.replace(/^data:image\/\w+;base64,/, "") - // log(User.getCurUserImagesPath()); - var filename = me.uuid() + '.png'; - fs.writeFile(User.getCurUserImagesPath() + '/' + filename, new Buffer(ret, 'base64'), function(err) { - if(err) { - log(err); - return; - } - // 保存 - var relativePath = User.getCurUserImagesAppPath() + '/' + filename; - File.addImage(relativePath); - - callback && callback('app://leanote/' + relativePath); - }); - }; - reader.readAsDataURL(blob); - } - }, + }; module.exports = Common; diff --git a/node_modules/evt.js b/node_modules/evt.js index 3a8ed2f4..e33ebe41 100644 --- a/node_modules/evt.js +++ b/node_modules/evt.js @@ -3,6 +3,11 @@ var User = require('user'); function log(o) {console.log(o)} var Evt = { + port: 8008, + localUrl: 'http://127.0.0.1:8008', + getImageLocalUrl: function(fileId) { + return this.localUrl + '/api/file/getImage?fileId=' + fileId; + }, // 项目绝对地址 getBasePath: function() { return process.cwd(); diff --git a/node_modules/file.js b/node_modules/file.js index 051c34d6..fa94d016 100644 --- a/node_modules/file.js +++ b/node_modules/file.js @@ -21,7 +21,6 @@ type File struct { Path string `Path` // the file path IsDefaultAlbum bool `IsDefaultAlbum` CreatedTime time.Time `CreatedTime` - FromFileId bson.ObjectId `bson:"FromFileId,omitempty"` // copy from fileId, for collaboration } @@ -29,6 +28,62 @@ type File struct { // 文件服务 var File = { + + // FileReaderWeb 是 web上的FileReader, 可能与nodejs这个有冲突 + pasteImage: function(event, FileReaderWeb, callback) { + var me = this; + var items = (event.clipboardData || event.originalEvent.clipboardData).items; // 可能有多个file, 找到属于图片的file + // find pasted image among pasted items + var blob; + for (var i = 0; i < items.length; i++) { + if (items[i].type.indexOf("image") === 0) { + blob = items[i].getAsFile(); + } + } + // console.log("paste images"); + // console.log(blob); + // load image if there is a pasted image + if (blob) { + // console.log("??"); + var reader = new FileReaderWeb(); + // console.log(">>") + // console.log(reader); + // console.log(">>") + reader.onloadend = function() { + console.log(reader); + // 这个事件在读取结束后,无论成功或者失败都会触发 + if (reader.error) { + console.log(reader.error); + } else { + } + } + reader.onload = function(e) { + // 上传之 + // log('result'); + // log(reader.result); + var ret = reader.result + ret = ret.replace(/^data:image\/\w+;base64,/, "") + // log(User.getCurUserImagesPath()); + var filename = Common.uuid() + '.png'; + fs.writeFile(User.getCurUserImagesPath() + '/' + filename, new Buffer(ret, 'base64'), function(err) { + if(err) { + log(err); + return; + } + // 保存 + var relativePath = User.getCurUserImagesAppPath() + '/' + filename; + + // 保存到数据库中 + File.addImage(relativePath, function(newImg) { + callback && callback(Evt.getImageLocalUrl(newImg.FileId)); + // callback && callback('app://leanote/' + relativePath); + }); + }); + }; + reader.readAsDataURL(blob); + } + }, + // path是相对于项目路径 addImage: function(path, callback) { var me = this; @@ -36,7 +91,7 @@ var File = { me._addImage(Common.objectId(), absolutePath, callback); }, - _addImage: function(fileId, absolutePath, callback) { + _addImage: function(fileId, absolutePath, callback, isForce) { // var absolutePath = Evt.getBasePath() + '/' + path; // 得到文件大小 var stat = fs.statSync(absolutePath); @@ -46,13 +101,18 @@ var File = { var ext = names[names.length-1]; var image = { FileId: fileId, + ServerFileId: '', Path: absolutePath, Name: name, UserId: User.getCurActiveUserId(), Title: name, Type: ext, Size: stat && stat.size, + IsDirty: true, // 本地是新添加的 CreatedTime: new Date() + }; + if(isForce) { + image.ServerFileId = fileId; } Images.insert(image, function(err, doc) { log(err); @@ -64,16 +124,22 @@ var File = { }) }, + // 从服务器上把文件download下来后 + // 这里的fileId是serverFileId, 本地的FileId也保存为该值 addImageForce: function(fileId, path, callback) { var me = this; // 先删除之, 可能是本地有记录, 但是文件没了 Images.remove({FileId: fileId}, function() { - me._addImage(fileId, path, callback); + me._addImage(fileId, path, callback, true); }); }, // 获取图片本地路径 + // 通过FileId可ServerFileId来查找 + // 因为图片的链接 有可能是本地添加的, 又有可能是远程的 + // 如果是远程的, FileId == ServerFileId, 是一样的, 所以不要Or getImageLocalPath: function(fileId, callback) { + // Images.findOne({$or: {FileId: fileId}, {ServerFileId: fileId}}, function(err, doc) { Images.findOne({FileId: fileId}, function(err, doc) { if(!err && doc && doc.Path) { // FileLocalPath是相对于项目的路径 callback(true, doc.Path); @@ -81,6 +147,17 @@ var File = { callback(false, false); } }); + }, + + // 得到fileIds所有的images, 为了发送到服务器上 + getAllImages: function(fileIds, callback) { + var me = this; + Images.find({$or:[{FileId: {$in: fileIds}}, {ServerFileId: {$in: fileIds}}]}, function(err, images) { + if(err || !images) { + return callback(false); + } + callback(images); + }); } }; diff --git a/node_modules/note.js b/node_modules/note.js index 42b45ebf..a60038f7 100644 --- a/node_modules/note.js +++ b/node_modules/note.js @@ -1,5 +1,7 @@ var async = require('async'); var db = require('db'); +var File = require('file'); +var Evt = require('evt'); var User = require('user'); var Notebook = require('notebook'); var Tag = require('tag'); @@ -513,16 +515,67 @@ var Note = { // 获得用户修改的笔记 getDirtyNotes: function(callback) { + var me = this; Notes.find({UserId: User.getCurActiveUserId(), IsDirty: true}, function(err, notes) { if(err) { log(err); return callback && callback(false); } else { - callback(notes); + // 每一个笔记得到图片, 附件信息和数据 + async.eachSeries(notes, function(note, cb) { + me.getNoteFiles(note.NoteId, note.Content, function(files) { + note.Files = files || []; + cb(); + }) + }, function() { + callback(notes); + }) } }); }, + // 得到笔记的文件 + getNoteFiles: function(noteId, content, callback) { + // 得到图片信息, 通过内容 + // http://localhost:8002/api/file/getImage?fileId=xxxxxx, 得到fileId, 查询数据库, 得到图片 + // console.log(content); + // console.log(Evt.localUrl + '/api/file/getImage?fileId=([0-9a-zA-Z]{24})'); + var reg = new RegExp(Evt.localUrl + "/api/file/getImage\\?fileId=([0-9a-zA-Z]{24})", 'g'); + var fileIds = []; + // var fileIdsMap = {}; // 防止多个 + while((result = reg.exec(content)) != null) { + // result = [所有, 子表达式1, 子表达式2] + if(result && result.length > 1) { + // console.log(result); + var fileId = result[1]; + fileIds.push(fileId); + } + } + var files = []; // {localFileId: "must", fileId: "", hasBody: true, filename: "xx.png"} + if(fileIds.length > 0) { + // 得到所有的图片 + File.getAllImages(fileIds, function(images) { + callback(images); + /* + if(!images) { + return; + } + for(var i in images) { + var image = images[i]; + files.push({ + localFileId: image.FileId, + fileId: image.ServerFileId, + hasBody: image.IsDirty, + filename: image.Name, + }); + } + */ + }); + } else { + callback(false); + } + }, + // 在send delete笔记时成功 setNotDirty: function(noteId) { Notes.update({NoteId: noteId}, {$set:{IsDirty: false}}) diff --git a/node_modules/server.js b/node_modules/server.js index 690a1367..7656c4f3 100644 --- a/node_modules/server.js +++ b/node_modules/server.js @@ -61,7 +61,6 @@ var Server = { return false; } - var realPath = basePath + pathname; var ext = path.extname(realPath); ext = ext ? ext.slice(1) : 'unknown'; diff --git a/note.html b/note.html index e16a8a2a..22843e21 100755 --- a/note.html +++ b/note.html @@ -22,7 +22,12 @@ - +