通过WebApi上传大文件(1-3GB)到SQL
本文关键字:1-3GB SQL 文件 WebApi 通过 | 更新日期: 2023-09-27 18:17:16
我有一个JS/HTML5前端,调用c# WebAPI上传一个大文件(1-3GB),需要加密,然后存储在SQL DB中。
我的限制是,我不能存储未加密的文件,它不能存储在SQL之外。我也不能使用SQL FileStream
对于WebAPI,我禁用了BufferStream(通过重写WebHostBufferPolicySelector)来处理任何内存异常。这允许我直接将文件上传到磁盘,而不会显著增加内存占用。
我想在SQL表中按行顺序存储组成文件的一系列加密块。然后我可以把数据块取出来,解密它们,并在用户请求时将它们流回给用户。
我不知道如何获取多数据部分消息,加密块,并将其写入数据库中的行。有人能告诉我怎么做吗?
OK。因此,您已经解决了WebAPI不会耗尽RAM的问题。但下一个问题是,你必须把数据传递给SQL Server。你可以将请求流通过任何。net流加密器进行管道传输,但之后它必须到达某个地方。
我建议你这样做:
请求流->加密器->自定义流
自定义流将负责以块向sql server发送数据。您可以微调块的大小,但这实际上是为了避免发送具有1GB或更多参数大小的sql命令。给定一个固定的缓冲区大小,您的自定义流sql命令将把上传分成字节块。当缓冲区超过一定数量时,您向SQL Server写入一行,刷新缓冲区,并等待从加密流进入更多。被写入的行将用某种类型的ID绑定在一起,当然,还有一个序列号,它将告诉您在重新组装它们时使用的顺序。
当你想把数据发送回来时,你只需要再做一次,但是反过来。