GridFS 如何在 Meteor 中工作?

How does GridFS work within Meteor?

我正在开发一个应用程序,管理员可以在其中上传日程表(只是一个文件),用户可以下载上传的文件。它现在与 Meteor 中的上传功能一起工作,解码文件保存到 Mongo 数据库。

问题是我只能上传16mb左右的文件。我做了一些研究,显然你可以用 GridFS 解决这个问题。我对此很陌生,文档似乎根本没有帮助。有人可以给我一个简单的例子来说明如何使用 GridFS 来解决我的问题吗?或者有人推荐任何其他解决方案吗?

这是我用于将文件上传到服务器的 UploadSchedule 方法:

uploadSchedule() {
    if (this.fileListNextMonth == null) {
      this.alertController.create(
        {
          title: "Error",
          subTitle: "Cannot upload file!",
          buttons: ['Ok']
        }
      ).present();
    } else {
      this.fileName = this.fileList[0].name;

      this.getBase64(this.fileList[0]).then(
        data =>
          this.scheduleProvider.uploadSchedule(data, this.fileName, true).then(observable => {
            const subscription = observable.subscribe(data => {
              console.log("data: " + data);
            }, err => console.error(err), () => subscription.unsubscribe());
          })
      );
    }
  }

在我的 ScheduleProvider 中有一个方法 (uploadSchedule),它使用特定文件向服务器发出 post 请求。在后端,我只是对已上传的文件执行插入,因此它将作为字符串保存到数据库中。

希望有人能帮助我。

谢谢!

我建议使用像 https://github.com/VeliovGroup/Meteor-Files 这样的软件包,因为它有详细的文档记录和测试,并且还允许您使用其他位置(例如 AWS S3)进行文件存储。

可以直接使用gridfs。但我不推荐它。

如果您真的只想将文件存储在 Mongo 数据库中,这里有一个很好的软件包:https://github.com/vsivsi/meteor-file-collection 这将有助于简化工作。

这两个包我自己都用过,效果不错。

还有 https://github.com/CollectionFS/Meteor-CollectionFS 是一个很好的包,但不再主动维护。我相信它使用起来很复杂。

在您的代码中,您似乎正在将文件转换为 base64 表示形式,这有效,但它确实使文件比原始文件大很多。在大文件上,这可能会导致一些性能挑战(以及它需要的额外内存)。

我建议将您的图像或文件存储在外部服务(如 S3)上,因为它可以减轻从 Meteor 服务器检索它们的负担,并且您会注意到性能差异 - 这就像为您的资产使用 CDN。