我正在尝试将超过 2GB 的大文件上传到 IIS 上的 ASP.NET MVC 5。 我google了一下,发现IIS有2GB的http请求限制,而MS还没有修复它。
我在以下链接中找到了使用 StreamContent 类和 HttpContext.Current.Request.GetBufferlessInputStream(true) 的解决方法; (参见 Priyanka 的回答)
超出 IIS 7.5 和 .NET 中的 2GB 文件上传限制
我确认,如果在 http 请求中仅未设置 Content-Length 标头,它就可以工作。
因此,我成功使用 PostMan 上传了一个超过 2GB 的文件,其中 Content-Length 标头未选中。
所以,我正在寻找一种方法来剥离(删除)http 请求中的 Content-Length 标头。 我发现了一个提示,可能可以通过 IIS Url Rewrite 实现。
您能否让我知道如何使用 IIS Url Rewrite 剥离(删除)http 请求中的 Content-Length 标头?
致以诚挚的问候。
某些请求标头我们无法使用 URL 重写规则或任何代码进行修改。 您可以尝试使用以下代码让iis上传更大的文件:
<requestFiltering>
<requestLimits maxAllowedContentLength="4294967295"/>
</requestFiltering>
<httpRuntime executionTimeout="2400" maxRequestLength="2147483647"/>
无法使用 IIS Url Rewrite 修改 Content-Length。并且编辑 Web.config 并不能帮助克服 2GB 限制。 幸运的是,在现代 Javascript 世界中,您可以使用 FileReader,更重要的是,您可以读取块并直接发送它们。
工作 jQuery 示例:
var file = $("input[type=file]")[0].files[0];
var offset = 0;
var chunkSize = 104857600;//100 MB
var fileReader = new FileReader();
var uploadNextChunk = function () {
if (offset < file.size)
fileReader.readAsArrayBuffer(file.slice(offset, offset + chunkSize));
};
fileReader.onload = function () {
$.ajax({
type: "POST",
url: "AjaxUpload.ashx?fileName=" + encodeURIComponent(file.name),
data: new Blob([fileReader.result]),
processData: false,
contentType: false,
success: function () {
offset += chunkSize;
uploadNextChunk();
}
});
};
uploadNextChunk();
和 C# 处理程序:
public void ProcessRequest(HttpContext context)
{
string path = @"Files\";
string fileName = context.Request.QueryString.Get("fileName");
using (FileStream fileStream = File.Open(path + fileName, FileMode.Append, FileAccess.Write))
{
context.Request.GetBufferlessInputStream(true).CopyTo(fileStream);
}
}
并检查 Web.config 中的 maxAllowedContentLength。它必须不小于选定的 chunkSize:
<requestLimits maxAllowedContentLength="104857600" />