【问题标题】:Large File (1-3GB) upload to SQL via WebApi [closed]大文件(1-3GB)通过 WebApi 上传到 SQL [关闭]
【发布时间】:2016-11-09 23:06:32
【问题描述】:

我有一个 JS/HTML5 前端,它调用 C# WebAPI 来上传需要加密然后存储在 SQL DB 中的大文件 (1-3GB)。

我的限制是我不能存储未经加密的文件,也不能存储在 SQL 之外。我也不能使用 SQL FileStream。

对于 WebAPI,我禁用了 BufferStream(通过覆盖 WebHostBufferPolicySelector)来处理任何内存异常。这使我可以将文件直接上传到磁盘,而不会显着增加内存占用。

我想将构成文件的一系列加密块按顺序存储在 SQL 表中的行中。然后我可以将这些块取出,解密它们,并在请求时将它们流回给用户。

我不知道如何获取多数据部分消息、加密块并将其写入数据库中的行。有人可以指出我如何做到这一点的正确方向吗?

【问题讨论】:

  • 大文件不存储在数据库中,而是存储在文件系统中,文件的路径存储在数据库中。
  • @zaph - 我知道文件通常不存储在数据库中。不幸的是,我没有写出我工作的要求。正如我上面提到的,我想使用 FileStream 但不认为我可以在不将文件加载到内存的情况下对其进行加密,所以我决定反对(我没有这样做的更大原因是因为它以你提到的方式存储文件)。这就是为什么我考虑存储各个块并加密每个块的原因。
  • 下一个问题是如何保护加密密钥,对获得数据库管理员访问权限的人保密——这就是攻击发生的方式。

标签: c# sql-server asp.net-web-api2


【解决方案1】:

好的。所以你已经解决了 WebAPI 没有用完 RAM 的问题。但下一个问题是您必须将数据传递给 SQL Server。您可以通过任何 .NET 流加密器对请求流进行管道传输,但之后它必须去某个地方。

我建议你这样做:

请求流 -> 加密器 -> 自定义流

自定义流将负责将数据发送到 chunks 中的 sql server。您可以微调块的大小,但本质上是这样您就不会尝试发送具有 1GB 或更大参数大小的 sql 命令。给定固定的缓冲区大小,您的自定义流 sql 命令会将上传分成字节块。当缓冲区超过一定数量时,您向 SQL Server 写入一行,刷新缓冲区,然后等待更多从加密器流中进入。写入的行将与某种 ID 绑定在一起,当然还有一个序列号,它会告诉您在重新组装它们时使用的顺序。

当您想发回数据时,您只需再次执行此操作,但相反。

【讨论】:

  • 这听起来正是我需要的......我只是不知道该怎么做。我猜要做到这一点,我会覆盖 MultiStreamProvider 的 GetStream 以获得对实际文件流的访问权限。在该方法中,我将通过加密流运行请求流以对其进行加密。之后,仍然在覆盖的 GetStream 方法中,我将创建一个新的自定义流实例,该实例将加密流作为输入,并且在自定义流的写入实现中,我会将流写入 sql。听起来对吗?我将如何进行缓冲区监控?提前致谢!
  • 我想你已经掌握了这个要点。确保检查自定义流处理方法内部缓冲区中的任何数据。就监控而言,我不太确定您在寻找什么。
  • 我有一个后续帖子,我相信我的大部分过程都在工作。我现在遇到的问题是我无法重新组装文件以正确下载。你介意看看我在这里整理的内容吗:[新的 stackoverflow 问题] (stackoverflow.com/questions/40616670/…)
猜你喜欢
  • 2020-03-27
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 2012-01-20
相关资源
最近更新 更多