mirror of
https://github.com/leanote/desktop-app.git
synced 2025-10-14 07:00:53 +00:00
图片同步
未解决: 从本地获取
This commit is contained in:
35
node_modules/api.js
generated
vendored
35
node_modules/api.js
generated
vendored
@@ -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
4
node_modules/common.js
generated
vendored
@@ -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
4
node_modules/evt.js
generated
vendored
@@ -6,6 +6,10 @@ var Evt = {
|
||||
// 项目绝对地址
|
||||
getBasePath: function() {
|
||||
return process.cwd();
|
||||
},
|
||||
getAbsolutePath: function(relative) {
|
||||
var me = this;
|
||||
return me.getBasePath() + '/' + relative;
|
||||
}
|
||||
};
|
||||
module.exports = Evt;
|
||||
|
38
node_modules/image.js → node_modules/file.js
generated
vendored
38
node_modules/image.js → node_modules/file.js
generated
vendored
@@ -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
49
node_modules/mime.js
generated
vendored
@@ -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
41
node_modules/note.js
generated
vendored
@@ -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
176
node_modules/server.js
generated
vendored
Normal 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
1
node_modules/user.js
generated
vendored
@@ -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) {
|
||||
|
Reference in New Issue
Block a user