是否有一个nodejs模块或如何使GridFS文件与WebDAV访问的例子



我有一个现有的node.js应用程序,用户有一个用GridFS存储的文件库。每个用户都有自己的库。我想让图书馆与WebDAV挂载,这样用户就可以从桌面上管理他们的图书馆。

我见过jsDAV用于访问文件系统,但不清楚如何扩展它以与虚拟文件系统一起使用。我找到了gitDav,但不清楚如何使用它。

如果不从头开始,这可能吗?

我希望使用jsDAV通过WebDAV提供一些资源。由于找不到一个可行的例子,我研究了源代码中的注释,并自己写了一个。jsDAV是一个来自PHP库的端口。Sabre手册在一般情况下是有用的指南。需要记住的一点是,由于我们处于异步环境中,在PHP中返回结果的函数可能不得不调用回调函数。当所讨论的操作涉及到从磁盘读取时,通常会发生这种情况。回调的第一个参数将始终是一个错误对象,如果一切正常,它应该为空。

'use strict';
var crypto = require('crypto');
var jsDAV = require("jsDAV/lib/jsdav");
var jsDAVLocksBackendFS = require("jsDAV/lib/DAV/plugins/locks/fs");
var jsDAVFile = require("jsDAV/lib/DAV/file");
var jsDAVCollection = require("jsDAV/lib/DAV/collection");
var jsExceptions = require("jsDAV/lib/shared/exceptions");
var VirtualFile = jsDAVFile.extend(
{    
    initialize: function(name, buffer) {
        this.name = name;
        this.buffer = buffer;
    },
    getName: function() {
        return this.name;
    },
    get: function(callback) {
        callback(null, this.buffer);
    },
    put: function(data, type, callback) {
        callback(new jsExceptions.Forbidden("Permission denied to change data"));
    },
    getSize: function(callback) {
        callback(null, this.buffer.length);
    },
    getETag: function(callback) {
        var shasum = crypto.createHash('sha1');
        shasum.update(this.buffer);
        var etag = '"' + shasum.digest('hex') + '"';
        callback(null, etag);
    },
    getContentType: function(callback) {
        callback(null, 'text/plain');
    }    
});
var VirtualDirectory = jsDAVCollection.extend(
{
    initialize: function(name, children) {
        this.name = name;
        this.children = children;        
    },
    getChildren: function(callback) {
        var list = [];
        for (var name in this.children) {
            list.push(this.children[name]);
        }
        callback(null, list);
    },
    getChild: function(name, callback) {
        var child = this.children[name];
        if (child) {
            callback(null, child);
        } else {
            callback(new jsExceptions.NotFound("File not found"));
        }
    },
    childExists: function(name, callback) {
        var exists = (this.children[name] !== undefined);
        callback(null, exists);
    },
    getName: function() {
        return this.name;
    }
});
var children = {};
for (var i = 1; i <= 10; i++) {
    var name = 'file' + i + '.txt';
    var text = 'Hello world, #' + i;
    children[name] = VirtualFile.new(name, new Buffer(text, 'utf8'));
}
var grandchildren = {};
for (var i = 66; i <= 99; i++) {
    var name = 'beer' + i + '.txt';
    var text = i + ' bottles of beer';
    grandchildren[name] = VirtualFile.new(name, new Buffer(text, 'utf8'));
}
children['folder'] = VirtualDirectory.new('folder', grandchildren);
var root = VirtualDirectory.new(null, children);
var options = {
    node: root,
    locksBackend: jsDAVLocksBackendFS.new(__dirname + "/data")
};
var port = 8000;
jsDAV.createServer(options, port);

看起来jsDAV是唯一的选择。它是PHP库的一个端口,它的设置方式不像普通的node.js模块那样使用它。我发现了一些服务器类型的例子,其他人已经创建了连接dropbox和couchdb。

我现在正在工作的服务器类型,将工作更像你会期望一个node.js模块工作。下一步将是使它与npm兼容。你可以看到我的叉子在这里

最新更新