Azure函数通过http触发请求分块读取大文件

Posted

技术标签:

【中文标题】Azure函数通过http触发请求分块读取大文件【英文标题】:Azure Function to read large file in chunks through http trigger request 【发布时间】:2021-09-23 08:21:12 【问题描述】:

我在 Azure 函数中有一个 API,它使用 Http 触发器接收数据并将其发送到本地应用程序。我们有 UI 前端,用户可以在其中上传大文件大小(无限制),并将数据以块的形式发送到 API。

我知道功能 App 的限制是 100MB,我还看到处理大文件大小的建议是使用 Blob 存储。但是对于同步过程,我们希望通过API来实现(避免在中间过程中将数据存储在blob存储中)。

有没有一种方法可以通过 Http 触发请求以块的形式接收数据?例如:UI -> 分块发送数据 -> API(使用 HttpTrigger)分块读取数据并分块发送数据 -> 本地。

例如: 公共静态异步任务运行( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger 日志)

如果发送者已经在块中流式传输数据,我如何从块中读取数据? 如果我读到类似下面的内容,只要有效负载

_bufferSize = 1048576;
byte[] datapayLoad;
while (dataRead >0)

dataRead = req.Body.Read(datapayLoad, 0, _bufferSize);
....

感谢您在这方面的帮助。

【问题讨论】:

你找到解决方案了吗?我也有同样的要求 是的。我已经使它完全异步,例如:UI -> 上传到 Blob 存储,向 API 发送事件。然后 API 将该事件转发到存储队列(这是避免 http 会话空闲超时所必需的)。还有另一个 API 将从存储队列中读取并以块的形式下载 blob 并以块的形式写入本地。 【参考方案1】:

我认为一种解决方案是在您的 UI/应用程序和 Azure Function API 之间放置一个 Azure 事件中心。这样您就可以捕获发送大量数据的每个事件并正确触发您的函数。

【讨论】:

【参考方案2】:

是否需要分块读取数据?如果发送者可以写入文件(以块的形式或一次)并在文件完全写入后发布事件,那就太好了。您的函数可以触发该事件并直接从 blob 存储中读取文件。

显式地读取块可能会引入不必要的复杂性,并且从长远来看可能并不可靠。只是一个建议。

【讨论】:

以上是关于Azure函数通过http触发请求分块读取大文件的主要内容,如果未能解决你的问题,请参考以下文章

如何从 HTTP 触发的 Azure 函数返回 blob?

(整理二)读取大日志文件

Http 触发器启用 Azure 函数超时

python大文件处理

Python:分块读取大文件

Python:分块读取大文件