【问题标题】:How can I specify a path and filename for my files with meteor and collectionfs filesystem如何使用流星和 collectionfs 文件系统为我的文件指定路径和文件名
【发布时间】:2014-07-11 16:02:13
【问题描述】:

我正在使用 CollectionFS 来存储从我的流星应用上传的文件。我正在使用 cfs-filesystem 包来使用本地文件系统保存我的文件。

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

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

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

【问题讨论】:

  • 您找到解决问题的方法了吗?我有同样的问题,下面的答案没有显示如何为每个用户创建目录。

标签: javascript meteor


【解决方案1】:

您可以使用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);
  }
});

【讨论】:

  • 请提供全文而不是链接,否则此答案将被社区删除。
【解决方案2】:

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

在存储适配器的声明中,您可以这样做:

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 属性命名。在上面的例子中,我没有保留扩展,但我想你明白了。为了清楚起见,我删除了它。如果您需要该代码,请告诉我。我有。
现在这实际上并没有将图像放在不同的文件夹中,但它确实允许您命名文件。

【讨论】:

    猜你喜欢
    • 2016-09-16
    • 2011-09-30
    • 2023-03-17
    • 1970-01-01
    • 2011-05-16
    • 2017-01-23
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多