GridFS如何在Meteor中运行?

时间:2018-04-26 22:31:39

标签: file ionic-framework meteor file-upload gridfs

我正在处理一个管理员可以上传日程表(只是一个文件)的应用程序,用户可以下载该上传的文件。它现在正在使用Meteor中的上传功能,解码后的文件将保存到Mongo DB中。

问题是我只能上传大约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请求。在后端我只使用已上传的文件执行插入操作,因此它将作为字符串保存到数据库中。

希望有人可以帮助我。

谢谢!

1 个答案:

答案 0 :(得分:2)

我建议使用像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一样资产。