Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过WebApi将大文件(1-3GB)上载到SQL_C#_Sql Server_Asp.net Web Api2 - Fatal编程技术网

C# 通过WebApi将大文件(1-3GB)上载到SQL

C# 通过WebApi将大文件(1-3GB)上载到SQL,c#,sql-server,asp.net-web-api2,C#,Sql Server,Asp.net Web Api2,我有一个JS/HTML5前端,它调用一个C#WebAPI来上传一个需要加密然后存储在SQL数据库中的大文件(1-3GB) 我的限制是,我不能存储未加密的文件,也不能存储在SQL之外。我也不能使用SQL文件流 对于WebAPI,我禁用了BufferStream(通过重写WebHostBufferPolicySelector)来处理任何内存异常。这使我可以直接将文件上载到磁盘,而不会显著增加内存占用 我想在SQL表中按行顺序存储组成文件的一系列加密块。然后,我可以提取数据块,对其进行解密,并在用户请

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

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

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

我想在SQL表中按行顺序存储组成文件的一系列加密块。然后,我可以提取数据块,对其进行解密,并在用户请求时将其流式传输回用户


我不知道如何获取多数据部分消息、加密数据块并将其写入数据库中的行。有人能给我指出正确的方向,告诉我怎么做吗

好的。因此,您已经解决了WebAPI没有耗尽RAM的问题。但下一个问题是必须将数据传递给SQL Server。您可以将请求流通过任何.NET流加密器进行传输,但随后它必须在之后的某个地方进行传输

我建议你做一些类似的事情:

请求流->加密程序->自定义流

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


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

大型文件不存储在数据库中,而是存储在文件系统中,文件路径存储在数据库中。@zaph-我知道文件通常不存储在数据库中。不幸的是,我无法为我的工作编写需求。正如我前面提到的,我曾考虑过使用FileStream,但认为在不将文件加载到内存的情况下无法对其进行加密,所以我决定不使用它(更大的原因是它以您提到的方式存储文件)。这就是为什么我考虑存储单个数据块并加密其中的每一个。下一个问题是如何保护加密密钥,对获得数据库管理员访问权限的人保密,这就是攻击发生的原因。这听起来正是我需要的。我只是不确定如何做。我猜要做到这一点,我将覆盖MultiStreamProvider的GetStream,以获得对实际文件流的访问。在该方法中,我将通过加密流运行请求流以对其进行加密。在此之后,仍然在重写的GetStream方法中,我将创建一个新的自定义流实例,该实例将加密流作为输入,在自定义流的写实现中,我将该流写入sql。听起来对吗?我将如何进行缓冲区监视?提前谢谢!我想你已经掌握了要点。确保检查自定义streams dispose方法中缓冲区中的任何数据。就监控而言,我真的不确定你在寻找什么。我有一个后续帖子,我相信我已经完成了大部分流程。我现在遇到的问题是,我无法重新组装文件以正确下载。你介意看看我在这里写的东西吗:[新的stackoverflow问题]()