gpt4 book ai didi

meteor - 如何使用 FileSystem 和 CollectionFS 将文件保存在文件夹中? (是的,真的。)

转载 作者:行者123 更新时间:2023-12-01 15:03:14 24 4
gpt4 key购买 nike

我想我错过了一些东西。我已经阅读了很多帖子/示例,但无法在我的系统上保存图像(我在本地工作)。

我的目标是什么?

我正在尝试将用户提交的文件保存在文件夹(服务器端)中。听起来容易吗?或许。

有什么问题?

简短回答:我不知道如何将文件保存在我的文件夹中。
您想了解更多信息吗?

一个文件上传的故事

我已经阅读了使用 路径 参数如 new FS.Store.FileSystem("thumb", { path: "/public/images/user/avatar" }) ,我必须声明我的收藏服务器端。但是当我调用 Avatars.insert() (头像是我收藏的名字),好像不存在。这是有道理的,因为这个集合只存在于服务器上。

所以我试图同时声明服务器端和客户端的集合(我已经阅读了一些关于它的例子)并且有效!该文件已正确添加到 MongoDB,但我的文件夹仍然是空的(我不确定,但我认为这是因为 Avatars.insert() 被称为客户端,因此使用的集合是客户端的集合,不能接受的集合path 参数)。

但是没问题!我创建了 2 个 Meteor 方法(一个客户端和一个服务器端),称为“updateAvatarFile”。有了这个“技巧”,我就能做到Meteor.call("updateAvatarFile", field.files[0]) ,它调用服务器端和客户端方法。所以我可以在客户端做一些 UI 的事情,然后在另一个上传文件。但我不能将文件作为参数传递。
field.files[0]包含文件客户端但服务器端它是一个空对象。我的问题是:如何上传文件?

我不能在客户端(因为我不能使用 path 参数)但我可以将文件传递给服务器。我确定我错过了一些东西,但我不知道是什么。

这是我的方法:

// /client/views/templates/settings.js
Template.settings.events({
'submit #updateAvatar': function (e, template) {
e.preventDefault();
const field = document.getElementsByName('avatar')[0];
Meteor.call('updateAvatarFile', field.files[0]);
}
});

// /client/lib/clientMethods.js
Meteor.methods({
'updateAvatarFile': function (file) {
// blabla
}
});

// /server/lib/serverMethods.js
Meteor.methods({
'updateAvatarFile': function (file) {
Avatars.insert(file, function (err, fileObj) {
if (err) {
console.log(err);
} else {
console.log(fileObj);
}
});
}
});

// /server/collections/serverAvatarCollection.js
Avatars = new FS.Collection("avatars", {
stores: [
new FS.Store.FileSystem("original", { path: "/public/images/user/avatar" }),
new FS.Store.FileSystem("thumb", { path: "/public/images/user/avatar" })
],
filter: {
maxSize: 1000000, //1Mo
allow: { contentTypes: ['image/*'] }
},
onInvalid: function (message) {
//throw new Meteor.Error(403, message);
}
});

// /client/collections/clientAvatarCollection.js
// (this one is actually in a comment block)
Avatars = new FS.Collection("avatars", {
stores: [
new FS.Store.FileSystem("original"),
new FS.Store.FileSystem("thumb")
],
filter: {
maxSize: 1000000, //1Mo
allow: { contentTypes: ['image/*'] }
},
onInvalid: function (message) {
alert(message);
}
});

我还尝试使用客户端方法插入文件,但得到了相同的结果(文件已添加到 MongoDB 但未保存到文件夹中)。

使用不同的 path值也不起作用。

编辑:或者也许我正在尝试使用错误的包?在我看来,将图片转换为 block 并将它们保存到 MongoDB 听起来非常奇怪和糟糕。你有什么建议吗?

编辑 2:
回答米歇尔·弗洛伊德 (抱歉,字符限制很烦人)。

首先,感谢您的回答!

1. 目前,我只是在尝试 Meteor,所以我同时拥有 autopublishinsecure安装。不发布/订阅我的收藏不会导致问题,对吗?

2. 在您回答之前,我已尝试通过放置我的 avatarCollection.js 来设置可用于服务器和客户端的集合。在 /collections .我在想不包含 的路径服务器 客户两侧自动可用。那么 /collections有什么区别和 /lib ? (我知道首先加载“lib”文件夹中的所有文件)。将集合放入 /collections 是否是一种不好的做法? ?也许我应该创建一个 /lib/collections文件夹 ?

3. (最后一点,对于长评论很抱歉)我已经尝试了你上面的建议,但它似乎没有用(或者我做错了什么,再次><)。当我使用 Avatars.insert() , CollectionFS 不会将文件保存在我的本地存储中。我还检查了我的硬盘的根目录,以防 CollectionFS 解释 /成为我机器的根,但它不是。另一方面,CollectionFS 在 MongoDB 中创建了 4 个集合( cfs._tempstore.chunkscfs.avatars.filerecordcfs_gridfs._tempstore.chunkscfs_gridfs._tempstore.files )- gridfs 很奇怪。我安装了 GridFS,但我使用 FileSystem -。这些表是 不是 空的。这就是为什么我认为 CollectionFS 将我的文件分成 block 并将它们保存在 MongoDB 中的原因。

最佳答案

你通常在正确的轨道上。 CollectionFS 使用存储适配器来处理实际的文件存储。您可以按照自己的意愿将文件放在 S3、gridFS 或本地文件系统上。通常避免将文件内容直接放在 Mongo 中。

首先,定义您的集合:

Avatars = new FS.Collection("avatars", {
stores: [
new FS.Store.FileSystem("original", { path: "/public/images/user/avatar" }),
new FS.Store.FileSystem("thumb", { path: "/public/images/user/avatar" })
],
filter: {
maxSize: 1000000, //1Mo
allow: { contentTypes: ['image/*'] }
},
onInvalid: function (message) {
//throw new Meteor.Error(403, message);
}
});

/lib !这将使服务器和客户端都可以使用它。

其次,确保您从服务器发布您的头像集合并从客户端订阅它。我在您的问题中没有看到任何发布/订阅代码。你需要它。

第三,如果你只是这样做:
Avatars.insert(...);

在带有文件的客户端上,然后是 CollectionFS,然后 CollectionFS 将负责为您存储它。问题是,它不会立即可用。实际上传和存储可能需要一段时间。你可以看看 fileObj.isUploaded例如查看文件是否准备就绪。

关于meteor - 如何使用 FileSystem 和 CollectionFS 将文件保存在文件夹中? (是的,真的。),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33433999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com