Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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# 如何在ASP.NET MVC中上载大小为1.25GB的文件_C#_Asp.net - Fatal编程技术网

C# 如何在ASP.NET MVC中上载大小为1.25GB的文件

C# 如何在ASP.NET MVC中上载大小为1.25GB的文件,c#,asp.net,C#,Asp.net,我的客户端正在通过应用程序上传超过1GB的文件。我知道我只能使用asp.net MVC应用程序上传100mb public static byte[] ReadStream(Stream st) { st.Position = 0; byte[] data = new byte[st.Length]; . . . . } 我在byte[]data=新字节[s

我的客户端正在通过应用程序上传超过1GB的文件。我知道我只能使用asp.net MVC应用程序上传100mb

 public static byte[] ReadStream(Stream st)
     {
         st.Position = 0;
         byte[] data = new byte[st.Length];
         .
         .
         .        
         . 
}
我在
byte[]data=新字节[st.Length]处出错因为
st.Length=1330768612
错误-“引发了“System.OutOfMemoryException”类型的异常。”

有什么方法可以上传超过1gb的文件吗?
为什么我们可以在webconfig中定义maxRequestLength=0-2097151,

我记得在一个旧项目中,我们必须找到一种方法,允许用户为我们的ASP.NET web应用程序上载2-4gb文件

 public static byte[] ReadStream(Stream st)
     {
         st.Position = 0;
         byte[] data = new byte[st.Length];
         .
         .
         .        
         . 
}
如果我没记错的话,我们使用了“文件上载控件”并编辑了web.config以允许更大的文件大小:

<system.web>
     <httpRuntime executionTimeout="2400" maxRequestLength="40960" />
</system.web>

另一种选择是使用HttpModule:


在我看来,你需要使用合适的工具来完成这项工作。Http根本不打算传输这样的大文件。为什么不改用ftp呢,也许你可以围绕它构建一个web界面。

显示给你的错误表明服务器没有足够的内存来处理内存中的文件。验证服务器是否有足够的内存来分配如此大的阵列/文件

您还可以尝试处理流的chunks。内存不足表明文件已发送到服务器,但服务器无法处理该文件


我真的认为这与您分配的数组的大小有关。它不适合您机器的内存(当然是分配给.NET的内存)。

错误表明您在尝试分配内存中的1GB字节数组时内存不足。这与MVC无关。您还应该注意,32位进程的内存限制是2GB。如果您的服务器运行32位操作系统,并且您为一次上载分配了1GB的操作系统,那么您将很快耗尽可用内存

与其尝试读取内存中的整个流,不如使用stream.read使用大小合理的缓冲区读取chunck中的数据,并通过写调用将chunck存储到文件流中。您不仅可以避免OutOfMemoryException,而且代码的运行速度也会快得多,因为您不必等到加载整个1GB后再将其存储到文件中

代码可以如此简单:

public static  void SaveStream(Stream st,string targetFile)
{
    byte[] inBuffer = new byte[10000];

    using(FileStream outStream=File.Create(targetFile,20000))
    using (BinaryWriter wr = new BinaryWriter(outStream))
    {
        st.Read(inBuffer, 0, inBuffer.Length);
        wr.Write(inBuffer);
    }
}

您可以调整缓冲区大小,以平衡吞吐量(上传和保存的速度)与可伸缩性(可以处理的客户端数量)。

我建议使用FTP或编写一个小型桌面应用程序。
HTTP从来没有打算发送这么大的文件。

这里有一个给你的建议

你怎么知道你只能上传100MB的文件?@Noldorin-+1,我只是想问一下……我没有尝试上传大于20-30mb的文件。所以不知道它是否支持1GB。因此,对于较大的上传,请寻找一些第三方工具/resources@Noldorin.. 我已经在MSDNFair上读了足够多的这1篇文章。你有没有测试过上传大于100MB的文件,看看会发生什么?它是否会无声地失败,是否有错误?谢谢@@Dal。。我一直在看配置文件@Pankaj-ooo上的设置对不起,忘了你的最后一行:)我同意,这个需求需要一个不同的工具,你不认为这会导致问题吗?如果您想使用web界面将文件放置在FTP上,您仍将使用http。当您想这样做时,您必须使用插件(java小程序、Flash、SilverLight,但这并不容易)来真正使用FTP,因为您不能依赖浏览器上传到FTP(仅afaik IE可用于将文件放在FTP上,因为它可以使用explorer.exe来显示FTP内容)。另一个缺点是,您可能需要向FTP上的用户授予访问权限(或以某种方式提供设置)。有完整的应用程序类别,如文档管理、WCM、所有类型的在线服务,它们要求能够上载大文件,并且不能使用FTP。此外,问题不在于工具或MVC,而在于几行代码中的一个bug。