如何使用meteor和collectionfs文件系统为我的文件指定路径和文件名

时间:2014-07-11 16:02:14

标签: javascript meteor

我使用CollectionFS存储从我的meteor应用程序上传的文件。我使用cfs-filesystem包使用本地文件系统保存我的文件。

现在,当我上传文件时,它会被保存到〜/ uploads / images-h9jWnALqSZMpAX4h4-IMG_3737.JPG

我有一个需要使用的现有文件系统结构,如果需要,我们需要手动遍历文件。

假设我想要自定义该路径〜/ uploads / jaredtmartin / IMG_3737.jpg。当一个不同的用户上传时,它会转到一个带有他名字的新文件夹,例如〜/ uploads / suzyq / IMG_1234.jpg。可以这样做吗?如果没有,我可以在哪里修改代码以实现它?

2 个答案:

答案 0 :(得分:3)

您可以使用fileKeyMaker,请参阅here

var imageStore = new FS.Store.FileSystem("images", {
  fileKeyMaker: function (fileObj) {
    // Lookup the copy
    var store = fileObj && fileObj._getInfo(name);
    // If the store and key is found return the key
    if (store && store.key) return store.key;

    // TO CUSTOMIZE, REPLACE CODE AFTER THIS POINT

    var filename = fileObj.name();
    var filenameInStore = fileObj.name({store: name});

    // If no store key found we resolve / generate a key
    return fileObj.collectionName + '-' + fileObj._id + '-' + (filenameInStore || filename);
  }
});

答案 1 :(得分:0)

我找到了一个更简单的解决方案(恕我直言)。

在存储适配器的声明中,您可以执行以下操作:

var photoStore = new FS.Store.FileSystem("photos", {
  transformWrite: function(fileObj, readStream, writeStream) {
    gm(readStream, fileObj.name).resize(100,100,"^").gravity('Center').crop(100,100).quality(100).autoOrient().stream().pipe(writeStream);
  },
  beforeWrite:function (fileObj) {
    var post = Posts.findOne(fileObj.postId);
    if (post.type==='Dog') return {name:slugify(post.name)};
    else return {name:slugify(post.title)};
  },
});

在此示例中,我的一些图像使用name属性命名,其他图像使用title属性命名。在上面的例子中,我没有保留扩展,但我认为你明白了。为清楚起见,我删除了如果您需要该代码,请告诉我。我有它。
现在这实际上并没有将图像放在不同的文件夹中,但它确实允许您命名文件。