我使用CollectionFS存储从我的meteor应用程序上传的文件。我使用cfs-filesystem包使用本地文件系统保存我的文件。
现在,当我上传文件时,它会被保存到〜/ uploads / images-h9jWnALqSZMpAX4h4-IMG_3737.JPG
我有一个需要使用的现有文件系统结构,如果需要,我们需要手动遍历文件。
假设我想要自定义该路径〜/ uploads / jaredtmartin / IMG_3737.jpg。当一个不同的用户上传时,它会转到一个带有他名字的新文件夹,例如〜/ uploads / suzyq / IMG_1234.jpg。可以这样做吗?如果没有,我可以在哪里修改代码以实现它?
答案 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属性命名。在上面的例子中,我没有保留扩展,但我认为你明白了。为清楚起见,我删除了如果您需要该代码,请告诉我。我有它。
现在这实际上并没有将图像放在不同的文件夹中,但它确实允许您命名文件。