我的客户端通过应用程序上传超过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,
答案 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:
答案 4 :(得分:0)
我建议使用FTP或编写一个小型桌面应用程序。 HTTP从未打算发送过如此大的文件。
答案 5 :(得分:0)