我正在处理一个管理员可以上传日程表(只是一个文件)的应用程序,用户可以下载该上传的文件。它现在正在使用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请求。在后端我只使用已上传的文件执行插入操作,因此它将作为字符串保存到数据库中。
希望有人可以帮助我。
谢谢!
答案 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一样资产。