mirror of
https://github.com/leanote/desktop-app.git
synced 2025-10-15 07:31:33 +00:00
253 lines
7.3 KiB
JavaScript
253 lines
7.3 KiB
JavaScript
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;
|
|
var Attachs = db.attachs;
|
|
|
|
function log(o) {
|
|
console.log(o);
|
|
}
|
|
/*
|
|
type File struct {
|
|
FileId bson.ObjectId `bson:"_id,omitempty"` //
|
|
UserId bson.ObjectId `bson:"UserId"`
|
|
AlbumId bson.ObjectId `bson:"AlbumId"`
|
|
Name string `Name` // file name
|
|
Title string `Title` // file name or user defined for search
|
|
Size int64 `Size` // file size (byte)
|
|
Type string `Type` // file type, "" = image, "doc" = word
|
|
Path string `Path` // the file path
|
|
IsDefaultAlbum bool `IsDefaultAlbum`
|
|
CreatedTime time.Time `CreatedTime`
|
|
FromFileId bson.ObjectId `bson:"FromFileId,omitempty"` // copy from fileId, for collaboration
|
|
}
|
|
|
|
*/
|
|
|
|
// 文件服务
|
|
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;
|
|
var absolutePath = Evt.getBasePath() + '/' + path;
|
|
me._addImage(Common.objectId(), absolutePath, callback);
|
|
},
|
|
|
|
_addImage: function(fileId, absolutePath, callback, isForce) {
|
|
// var absolutePath = Evt.getBasePath() + '/' + path;
|
|
// 得到文件大小
|
|
var stat = fs.statSync(absolutePath);
|
|
var paths = absolutePath.split('/');
|
|
var name = paths[paths.length-1];
|
|
var names = name.split('.');
|
|
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);
|
|
if(err) {
|
|
callback && callback(false);
|
|
} else {
|
|
callback && callback(doc);
|
|
}
|
|
})
|
|
},
|
|
|
|
// 从服务器上把文件download下来后
|
|
// 这里的fileId是serverFileId, 本地的FileId也保存为该值
|
|
addImageForce: function(fileId, path, callback) {
|
|
var me = this;
|
|
// 先删除之, 可能是本地有记录, 但是文件没了
|
|
Images.remove({FileId: fileId}, function() {
|
|
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);
|
|
} else {
|
|
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);
|
|
});
|
|
},
|
|
|
|
// 笔记添加/修改后会有LocalFileId <=> FileId映射
|
|
// 这个只对image有用
|
|
updateImageForce: function(files) {
|
|
if(!files) {
|
|
// callback && callback(false);
|
|
return;
|
|
}
|
|
for(var i in files) {
|
|
var file = files[i];
|
|
if(file.IsAttach) {
|
|
continue;
|
|
}
|
|
if(!file.FileId || !file.LocalFileId) {
|
|
continue;
|
|
}
|
|
Images.update({FileId: file.LocalFileId}, {$set: {ServerFileId: file.FileId, IsDirty: false}});
|
|
}
|
|
},
|
|
|
|
// 附件操作
|
|
addAttach: function(filePaths, noteId, callback) {
|
|
if(!noteId || !filePaths) {
|
|
return callback && callback(false);
|
|
}
|
|
filePaths = filePaths.split(';');
|
|
// 复制每一个文件, 保存到数据库中
|
|
var targets = [];
|
|
for(var i in filePaths) {
|
|
var filePath = filePaths[i];
|
|
var fileStat = fs.statSync(filePath);
|
|
var paths = filePath.split('/');
|
|
var name = paths[paths.length-1];
|
|
var names = name.split('.');
|
|
var ext = names[names.length-1];
|
|
|
|
var rename = Common.uuid() + "." + ext;
|
|
var distPath = User.getCurUserAttachsPath() + '/' + rename;
|
|
var readable = fs.createReadStream(filePath);
|
|
// 创建写入流
|
|
var writable = fs.createWriteStream(distPath);
|
|
// 通过管道来传输流
|
|
readable.pipe(writable);
|
|
var attach = {
|
|
FileId: Common.objectId(),
|
|
ServerFileId: '',
|
|
Path: distPath,
|
|
NoteId: noteId,
|
|
Name: rename,
|
|
UserId: User.getCurActiveUserId(),
|
|
Title: name,
|
|
IsDirty: true, // 先添加的肯定是dirty, 什么时候不是dirty ? sync 和 send changes后
|
|
Type: ext,
|
|
Size: fileStat && fileStat.size,
|
|
IsDirty: true, // 本地是新添加的, ServerFileId = 0
|
|
CreatedTime: new Date()
|
|
};
|
|
Attachs.insert(attach);
|
|
targets.push(attach);
|
|
}
|
|
|
|
callback && callback(targets);
|
|
},
|
|
// 删除不存在的attachs
|
|
deleteNotExistsAttach: function(noteId, attachs) {
|
|
var me = this;
|
|
// console.log('--');
|
|
Attachs.find({NoteId: noteId}, function(err, everAttachs) {
|
|
if(err) {
|
|
return;
|
|
}
|
|
var nowMap = {};
|
|
for(var i in attachs) {
|
|
nowMap[attachs[i].FileId] = attachs[i];
|
|
}
|
|
var fileBasePath = User.getCurUserAttachsPath();
|
|
for(var i in everAttachs) {
|
|
var attach = everAttachs[i];
|
|
if(!nowMap[attach.FileId]) { // 如果不在, 则删除之
|
|
Attachs.remove({FileId: attach.FileId});
|
|
// 删除源文件, 别删错了啊
|
|
if(attach.Path.indexOf(fileBasePath) >= 0) {
|
|
fs.unlink(attach.Path);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
module.exports = File; |