在测试的后期,我发现我的应用程序在发送超过 2 GB (Int32.MaxValue)的文件时出现了问题。有没有简单的方法来解决这个问题?这些是大型高清 .mov 电影文件。我在控制器中使用 Response.WriteFile 来确保浏览器不打开任何文件(大多数是不会被浏览器打开的大型视频文件,但并非全部),并强制下载以及执行一些日志记录。
目前,我的唯一选择是使用 ajax 进行基于 JavaScript 的记录,并直接链接到大型 mov 文件,但我希望避免在开发过程的这么晚更改我的记录方法,并且希望所有链接都使用一个记录方法,无论是需要使用 writefile 发送的文件,还是大型 mov 文件,都不会被浏览器打开,以简化操作。但似乎我没有太多选择。
阻止此类大文件传输的逻辑是什么?在堆栈跟踪中,我看到到处都是 Int64 大小,而不是 Int32,那么为什么它不起作用?
我正在使用最新的 MVC(4.5.2)和 VS2015。
当我请求一个大文件时,我得到以下错误:
目前,我的唯一选择是使用 ajax 进行基于 JavaScript 的记录,并直接链接到大型 mov 文件,但我希望避免在开发过程的这么晚更改我的记录方法,并且希望所有链接都使用一个记录方法,无论是需要使用 writefile 发送的文件,还是大型 mov 文件,都不会被浏览器打开,以简化操作。但似乎我没有太多选择。
阻止此类大文件传输的逻辑是什么?在堆栈跟踪中,我看到到处都是 Int64 大小,而不是 Int32,那么为什么它不起作用?
我正在使用最新的 MVC(4.5.2)和 VS2015。
当我请求一个大文件时,我得到以下错误:
[ArgumentOutOfRangeException: The size parameter must be between zero and the maximum Int32 value.
Parameter name: size
Actual value was 4563025348.]
System.Web.HttpFileResponseElement..ctor(String filename, Int64 offset, Int64 size, Boolean isImpersonating, Boolean useTransmitFile, Boolean supportsLongTransmitFile) +3824261
System.Web.HttpWriter.WriteFile(String filename, Int64 offset, Int64 size) +119
System.Web.HttpResponse.WriteFile(String filename, Boolean readIntoMemory) +359
System.Web.HttpResponseWrapper.WriteFile(String filename) +30
以下是我控制器代码与此相关的部分:
Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
Response.WriteFile(filePath);
Response.End();
谢谢
N.
编辑: 最终代码如下:
using (FileStream fs = new FileStream(serverPath, FileMode.Open))
{
byte[] buffer = new byte[4096];
int count = 0;
Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
while ((count = fs.Read(buffer, 0, buffer.Length)) > 0)
{
Response.OutputStream.Write(buffer, 0, count);
Response.Flush();
}
}
HttpContext.ApplicationInstance.CompleteRequest();
FileResult
来完成你需要的功能呢? - Wiktor Zychla