如何在ASP.NET MVC中上传文件大小1.25GB

时间:2010-07-08 07:41:51

标签: c# asp.net

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

 public static byte[] ReadStream(Stream st)
     {
         st.Position = 0;
         byte[] data = new byte[st.Length];
         .
         .
         .        
         . 
}

我在byte[] data = new byte[st.Length];收到错误,因为st.Length=1330768612 错误 - “抛出类型'System.OutOfMemoryException'的异常。”

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

6 个答案:

答案 0 :(得分:3)

IMO您需要使用正确的工具来完成工作。 Http根本不打算传输像这样的大文件。为什么不使用ftp,也许你可以围绕它建立一个Web界面。

答案 1 :(得分:1)

显示给您的错误表明服务器没有足够的内存来处理内存中的文件。验证您的服务器是否有足够的内存来分配这么大的数组/文件。

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

我真的认为它与你分配的数组的大小有关。它只是不适合你机器的内存(在分配给.NET的内存中)。

答案 2 :(得分:1)

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

使用Stream.Read不是尝试读取内存中的整个流,而是使用合理大小的缓冲区读取chuncks中的数据,并使用Write调用将chuncks存储到文件流中。您不仅会避免OutOfMemoryExceptions,而且您的代码运行速度也会快得多,因为在将其存储到文件之前,您不必等待加载整个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);
    }
}

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

答案 3 :(得分:0)

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

如果我没记错的话,我们使用了'文件上传控件'并编辑了web.config以允许更大的文件大小:

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

另一种选择是使用HttpModule:

http://dotnetslackers.com/Community/blogs/haissam/archive/2008/09/12/upload-large-files-in-asp-net-using-httpmodule.aspx

答案 4 :(得分:0)

我建议使用FTP或编写一个小型桌面应用程序。 HTTP从未打算发送过如此大的文件。

答案 5 :(得分:0)