如何在 NodeJS Web 应用程序中存储和访问大文件

Posted

技术标签:

【中文标题】如何在 NodeJS Web 应用程序中存储和访问大文件【英文标题】:How to Store and Access Large Files in NodeJS Web Application 【发布时间】:2019-01-22 21:34:00 【问题描述】:

如果我想允许用户在帖子中上传视频,那么存储它以便我以后可以访问它的最佳方式是什么?我目前只是使用 INSERT 查询将其上传到 PostGres SQL 数据库字段,但速度非常慢。

是否有另一种方法或最佳实践来存储这样的大文件并快速有效地访问它?

var video = videoFile ? "'\\x" + videoFile.buffer.toString('hex') + "'" : "NULL";
let insertQuery = "INSERT INTO posts (video) VALUES(" + video + ") RETURNING *";

上面是我现在用来将文件插入数据库的代码。

【问题讨论】:

最好提供一些代码和SQL查询。否则,人们会否决您的问题。 【参考方案1】:

不要将整个视频存储到数据库中。下面这 2 个步骤可能是更好的解决方案:

1) 将视频文件上传到云存储。请参阅 Google Cloud Strage 和 Amazon S3。还有许多其他选择。自己去比较一下吧。

2) 您将拥有一个链接或 ID(或 S3 中的密钥)来访问文件。将所有这些链接或 ID 存储到您的数据库中。请看看这个GCS doc 和这个S3 question。

另外,利用 non-blocking I/O,这是 node.js 的一个好东西。在你的情况下,你可以尝试这样的事情:

let insertQuery;
let promisesList=[];

for(let vid of videoIds)
    insertQuery = "INSERT INTO posts (videoId) VALUES($1) RETURNING *";
    promisesList.push(client.query(query,[vid]));

await Promise.all();

【讨论】:

感谢您的帮助。快速跟进问题:使用云存储服务和 postgres 数据库存储大文件有什么区别?云存储服务在插入和获取数据方面如何比 SQL 查询快得多?

以上是关于如何在 NodeJS Web 应用程序中存储和访问大文件的主要内容,如果未能解决你的问题,请参考以下文章

你应该如何存储访问令牌?

在Nodejs中获取Web访问者IP地址[重复]

如何在 NodeJS 中获取 Instagram 用户名和访问令牌

如何使用 nodejs / express 将数据存储在 mongodb 中?

哪个是基于NodeJS的Azure Web App(Linux)上运行的默认Web服务器?

NodeJS 中的 LRU 缓存(CLOCK-2-hand)实现