图片同步

未解决: 从本地获取
This commit is contained in:
life
2015-01-23 20:43:21 +08:00
parent f6cc411735
commit 245bbb0236
13 changed files with 306 additions and 71 deletions

35
node_modules/api.js generated vendored
View File

@@ -11,6 +11,7 @@ function log(o) {
// 远程数据服务
var Api = {
leanoteUrl: 'http://localhost:9000',
baseUrl: 'http://localhost:9000/api',
getUrl: function(url, param) {
var url = this.baseUrl + '/' + url;
@@ -131,7 +132,10 @@ var Api = {
// 将https://leanote.com/api/resource/getImage?imageId=xx
// 转成app://leanote/public/files, 内部可以是个服务器吗? 请求内部的controller
getImage: function(fileId, callback) {
needle.get('http://localhost:9000/images/logo.png', function(err, resp) {
var me = this;
var url = me.getUrl('file/getImage', {fileId: fileId});
log(url);
needle.get(url, function(err, resp) {
// log(resp.body);
/*
{ 'accept-ranges': 'bytes',
@@ -141,7 +145,34 @@ var Api = {
date: 'Mon, 19 Jan 2015 15:01:47 GMT',
*/
// log(resp.headers);
fs.writeFile('/Users/life/Desktop/aa.png', resp.body);
if(err) {
callback(false);
} else {
var typeStr = resp.headers['content-type'];
log(resp.headers);
log(typeStr);
var type = 'png';
if(typeStr) {
var typeArr = typeStr.split('/');
if(typeStr.length > 1) {
type = typeArr[1];
}
}
var filename = Common.uuid() + '.' + type;
var imagePath = User.getCurUserImagesPath();
var imagePathAll = imagePath + '/' + filename;
log(imagePathAll);
fs.writeFile(imagePathAll, resp.body, function(err) {
if(err) {
log(err);
log('local save image failed 本地保存失败');
callback(false);
} else {
callback(imagePathAll, filename);
}
});
}
});
},
};

4
node_modules/common.js generated vendored
View File

@@ -1,6 +1,6 @@
var fs = require('fs');
var User = require('user');
var Image = require('image');
var File = require('file');
var Evt = require('evt');
var ObjectId = require('objectid');
@@ -77,7 +77,7 @@ var Common = {
}
// 保存
var relativePath = User.getCurUserImagesAppPath() + '/' + filename;
Image.addImage(relativePath);
File.addImage(relativePath);
callback && callback('app://leanote/' + relativePath);
});

4
node_modules/evt.js generated vendored
View File

@@ -6,6 +6,10 @@ var Evt = {
// 项目绝对地址
getBasePath: function() {
return process.cwd();
},
getAbsolutePath: function(relative) {
var me = this;
return me.getBasePath() + '/' + relative;
}
};
module.exports = Evt;

View File

@@ -1,7 +1,9 @@
var db = require('db');
var fs = require('fs');
var path = require('path');
var Evt = require('evt');
var User = require('user');
var Common = require('common');
var Images = db.images;
function log(o) {
@@ -25,19 +27,26 @@ type File struct {
*/
// 图片服务
var Image = {
// 文件服务
var File = {
// path是相对于项目路径
addImage: function(path, callback) {
var me = this;
var absolutePath = Evt.getBasePath() + '/' + path;
me._addImage(Common.objectId(), absolutePath, callback);
},
_addImage: function(fileId, absolutePath, callback) {
// var absolutePath = Evt.getBasePath() + '/' + path;
// 得到文件大小
var stat = fs.statSync(absolutePath);
var paths = path.split('/');
var paths = absolutePath.split('/');
var name = paths[paths.length-1];
var names = name.split('.');
var ext = names[names.length-1];
var image = {
Path: path,
FileId: fileId,
Path: absolutePath,
Name: name,
UserId: User.getCurActiveUserId(),
Title: name,
@@ -53,7 +62,26 @@ var Image = {
callback && callback(doc);
}
})
},
addImageForce: function(fileId, path, callback) {
var me = this;
// 先删除之, 可能是本地有记录, 但是文件没了
Images.remove({FileId: fileId}, function() {
me._addImage(fileId, path, callback);
});
},
// 获取图片本地路径
getImageLocalPath: function(fileId, callback) {
Images.findOne({FileId: fileId}, function(err, doc) {
if(!err && doc && doc.Path) { // FileLocalPath是相对于项目的路径
callback(true, doc.Path);
} else {
callback(false, false);
}
});
}
};
module.exports = Image;
module.exports = File;

49
node_modules/mime.js generated vendored
View File

@@ -1,49 +0,0 @@
var fs = require('fs');
var path = require('path');
var _ = require('underscore');
var map = {
'compressed': ['zip', 'rar', 'gz', '7z'],
'text': ['txt', 'md', ''],
'image': ['jpg', 'jpge', 'png', 'gif', 'bmp'],
'pdf': ['pdf'],
'css': ['css'],
'html': ['html'],
'word': ['doc', 'docx'],
'powerpoint': ['ppt', 'pptx'],
'movie': ['mkv', 'avi', 'rmvb'],
};
var cached = {};
exports.stat = function(filepath) {
var result = {
name: path.basename(filepath),
path: filepath,
};
try {
var stat = fs.statSync(filepath);
if (stat.isDirectory()) {
result.type = 'folder';
} else {
var ext = path.extname(filepath).substr(1);
result.type = cached[ext];
if (!result.type) {
for (var key in map) {
if (_.include(map[key], ext)) {
cached[ext] = result.type = key;
break;
}
}
if (!result.type)
result.type = 'blank';
}
}
} catch (e) {
window.alert(e);
}
return result;
}

41
node_modules/note.js generated vendored
View File

@@ -3,6 +3,7 @@ var User = require('user');
var Notebook = require('notebook');
var Tag = require('tag');
var Api = require('api');
var Server = require('server');
var Common = require('common');
var Notes = db.notes;
@@ -98,17 +99,6 @@ var Note = {
},
// 远程修改本地内容
updateNoteContentForce: function(noteId, content) {
Notes.update({NoteId: noteId}, { $set: {Content: content, IsContentDirty: false} }, {}, function (err, numReplaced) {
if(err) {
log(err);
callback && callback(false);
} else {
callback && callback(true);
}
});
},
// 获取笔记列表
getNotes: function(notebookId, callback) {
@@ -154,8 +144,33 @@ var Note = {
});
},
// 远程修改本地内容
updateNoteContentForce: function(noteId, content, callback) {
// <img src="http://localhost:9000/api/file/getImage?fileId=54c2083f99c37bea5f000001">
// 改成<img src="http://localhost:3232/api/file/getImage?fileId=xxx"
var reg = new RegExp('<img *src="' + Api.leanoteUrl + '/api/file/getImage', 'g');
content = content.replace(reg, '<img src="' + Server.localUrl + '/api/file/getImage');
log("----<>");
log(content);
Notes.update({NoteId: noteId}, { $set: {Content: content, InitSync: false, IsContentDirty: false} }, {}, function (err, numReplaced) {
if(err) {
log(err);
callback && callback(false);
} else {
callback && callback(content);
}
});
},
/*
// 同步内容
updateNoteContentForce: function(noteId, content, callback) {
// 将笔记内容中
Notes.update({NoteId: noteId}, { $set: {Content: content, InitSync: false} }, {}, function (err, numReplaced) {
if(err) {
log(err);
@@ -165,6 +180,7 @@ var Note = {
}
});
},
*/
// 得到笔记内容
getNoteContent: function(noteId, callback) {
@@ -183,7 +199,8 @@ var Note = {
Api.getNoteContent(noteId, function(noteContent) {
// 同步到本地
if(Common.isOk(noteContent)) {
me.updateNoteContentForce(noteId, noteContent.Content, function(ret) {
me.updateNoteContentForce(noteId, noteContent.Content, function(content) {
noteContent.Content = content;
callback && callback(noteContent);
});
} else {

176
node_modules/server.js generated vendored Normal file
View File

@@ -0,0 +1,176 @@
var Evt = require('evt');
var Common = require('common');
var File = require('file');
var Api = require('api');
var db = require('db');
var http = require('http');
var url = require('url');
var path = require('path');
var fs = require('fs');
function log(o) {
console.log(o);
}
// http server, 处理笔记图片
var Server = {
port: 8008,
localUrl: 'http://127.0.0.1:8008',
_started: false,
_req: null,
mime: {
"css": "text/css",
"gif": "image/gif",
"html": "text/html",
"ico": "image/x-icon",
"jpeg": "image/jpeg",
"jpg": "image/jpeg",
"js": "text/javascript",
"json": "application/json",
"pdf": "application/pdf",
"png": "image/png",
"svg": "image/svg+xml",
"swf": "application/x-shockwave-flash",
"tiff": "image/tiff",
"txt": "text/plain",
"wav": "audio/x-wav",
"wma": "audio/x-ms-wma",
"wmv": "video/x-ms-wmv",
"xml": "text/xml"
},
start: function() {
var me = this;
if(me._started) {
return;
}
var basePath = process.cwd();
var server = http.createServer(function (request, response) {
var pathname = url.parse(request.url).pathname;
me._req = request;
if(!pathname) {
return me.e404(response);
}
while(pathname[0] == '/') {
pathname = pathname.substr(1);
}
if(pathname == 'api/file/getImage') {
return me.getImage(request, response);
} else {
response.end();
return false;
}
var realPath = basePath + pathname;
var ext = path.extname(realPath);
ext = ext ? ext.slice(1) : 'unknown';
fs.exists(realPath, function (exists) {
if (!exists) {
response.writeHead(404, {
'Content-Type': 'text/plain'
});
response.write("This request URL " + pathname + " was not found on this server.");
response.end();
} else {
fs.readFile(realPath, "binary", function (err, file) {
if (err) {
response.writeHead(500, {
'Content-Type': 'text/plain'
});
response.end(err);
} else {
var contentType = me.mime[ext] || "text/plain";
response.writeHead(200, {'Content-Type': contentType});
response.write(file, "binary");
response.end();
}
});
}
});
});
server.listen(me.port);
console.log("Server runing at port: " + me.port + ".");
me.localUrl = 'http://127.0.0.1:' + me.port;
me._started = true;
},
e404: function(res) {
var me = this;
res.writeHead(404, {
'Content-Type': 'text/plain'
});
res.write("This request URL " + me._req.url + " was not found on this server.");
res.end();
},
// 返回图片
retImage: function(filePath, res) {
var me = this;
var ext = path.extname(filePath);
ext = ext ? ext.slice(1) : 'unknown';
fs.readFile(filePath, "binary", function (err, file) {
if (err) {
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end();
} else {
var contentType = me.mime[ext] || "text/plain";
res.writeHead(200, {'Content-Type': contentType});
res.write(file, "binary");
res.end();
}
});
},
// 处理用户图片
getImage: function(req, res) {
var me = this;
// fileId
var fileId = url.parse(req.url, true).query['fileId'];
if(!fileId) {
return me.e404(res);
}
// 先查看本地是否有该文件
// has表示本地数据库有记录
File.getImageLocalPath(fileId, function(has, fileLocalPath) {
// 本地有
if(has && fileLocalPath && path.exists(fileLocalPath) ) {
if(fileLocalPath) {
me.retImage(fileLocalPath, res);
// 本地没有路径
} else {
// 这里不会执行, 会执行下面的, 本地没有图片, 要从远程获取
// 是否需要重新从远程获取呢?
log('本地有数据, 但是图片找不到了, 可能自己删除了图片?');
me.e404(res);
}
} else {
// 访问api, 得到图片
Api.getImage(fileId, function(fileLocalPath, filename) {
if(fileLocalPath) {
log('图片保存到本地成功');
// 保存到本地数据库中
File.addImageForce(fileId, fileLocalPath, function(doc) {
if(doc) {
log('保存到本地数据库成功');
} else {
log('保存到数据库失败');
}
return me.retImage(fileLocalPath, res);
});
} else {
// 远程取不到图片, 是没有网络? 还是远程真的没有了
// TODO
log('取不远程的图片' + fileId);
return me.e404(res);
}
});
}
});
}
};
module.exports = Server;

1
node_modules/user.js generated vendored
View File

@@ -59,6 +59,7 @@ var User = {
},
// 打开软件时, 从db中获取当前用户
init: function(callback) {
console.log("......user init.......")
var me = this;
db.users.findOne({IsActive: true}, function(err, doc) {
if(err || !doc) {