我有一个内部网应用程序需要上传(.iso)超过2GB的文件。看来2GB文件大小有很多限制因素。
看来你可以设置另一个文件大小限制,其中maxAllowedContentLength大约为4GB,因为它的类型为uint,但是当我们仍然受到maxRequestLength的2GB限制时会有什么好处呢?
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="4294967295" />
</requestFiltering>
</security>
<system.webServer>
有没有人有任何解决方案可以上传超过2GB限制的文件?
答案 0 :(得分:4)
您是否对JavaScript解决方案持开放态度?如果是这种情况,请尝试this jQuery插件,它允许您上传海量数据(很多GB)。 如果浏览器不支持提供受TCP / IP发送和接收包相应ACK的机制,则使用HTML5 FileReader API功能和Silverlight回退上传文件。文件按配置大小上传(默认为4 MB)。
Plus:它还带有文件队列模式。
以下是您在Razor视图中如何使用它的示例:
$(function () {
var file = $("#file").createUploaderHtml5({
postDataUrl: "@Url.Action("Upload", "Home")",
packetSize: 4 * 1024 * 1024,
onPreparingUpload: function (plugin, ufname, umime, usize) {
plugin.settings.logger("ufname = [" + ufname + "] umime = [" + umime + "] usize = [" + usize + "]");
return true;
},
onInitPacketArrived: function (plugin, guid) {
plugin.settings.logger("guid = [" + guid + "]");
},
onDataPacketArrived: function (plugin, ack, total) {
//plugin.settings.logger("ACK [" + ack.Guid + "] packet = [" + ack.Packet + "] total = [" + total + "]");
var percent = Math.round(ack.Packet / total * 100);
$("#progressbar").attr("value", percent);
$("#percent").html(percent + " %");
},
onFileUploaded: function (pl) {
pl.settings.logger("File finished!!!");
},
logger: function(msg) {
var lg = $("#logger");
lg.html(lg.html() + msg + "<br />");
}
});
$("#start").click(function () {
file.startUpload();
});
$("#stop").click(function () {
file.cancelUpload();
});
});
以下是上传操作的代码:
[HttpPost]
public ActionResult Upload(FormCollection collection)
{
var packetSize = 4 * 1024 * 1024; // default to 4 MB
var filePath = Server.MapPath("~/_temp_upload/");
var result = UploadHelper.ProcessRequest(Request, filePath, packetSize);
if (result != null)
{
var metadata = UploadHelper.GetMetadataInfo(filePath, result.Guid);
// do anything with the metadata
}
if (result != null)
return Json(result);
return Content("");
}
答案 1 :(得分:1)
今年我在与各种浏览器上传到IIS服务器的大文件进行了大量的斗争。这是我发现的:
ASP.NET supports upload over 2Gb since .Net 4.5(可能它支持最多long.MaxValue
的文件)。但IIS本身不支持超过2Gb的上传。因此,IIS中托管的任何服务器都不支持2Gb上传。
据我所知,将maxAllowedContentLength
或maxRequestLength
设置为超过2Gb的值无济于事,因为这些设置适用于ASP.NET,而核心问题则出现在IIS中。
答案 2 :(得分:0)
通过进行以下更改,我可以使用Web API和IIS最多上传4 GB。 在Web api项目中,web.config中的以下2项更改设置了最大长度。
<requestFiltering>
<requestLimits maxAllowedContentLength="4294967295"/>
</requestFiltering>
<httpRuntime targetFramework="4.5.2" executionTimeout="2400" maxRequestLength="2147483647"/>
在调用Web api时在客户端添加分块标头,如下所示,这将阻止IIS通过流化文件来限制2 GB以上的文件-
HttpClient.DefaultRequestHeaders.Add("Transfer-Encoding", "chunked");
在读取服务器端流(Web api控制器)之前添加以下代码,以使用重载方法GetBufferlessInputStream(disableMaxLength)来忽略2 GB的最大请求长度-
var content = new StreamContent(HttpContext.Current.Request.GetBufferlessInputStream(true));
foreach(var header in Request.Content.Headers) {
content.Headers.TryAddWithoutValidation(header.Key, header.Value);
}
await content.ReadAsMultipartAsync(streamProvider);
在服务器端更改策略选择器,以便禁用缓冲并改为流式传输文件。添加以下类以覆盖控制器的WebHostBufferPolicySelector(例如,下面的代码段中的“文件”控制器)-
public class NoBufferPolicySelector: WebHostBufferPolicySelector {
public override bool UseBufferedInputStream(object hostContext) {
var context = hostContext as HttpContextBase;
if (context != null && context.Request.RequestContext.RouteData.Values["controller"] != null) {
if (string.Equals(context.Request.RequestContext.RouteData.Values["controller"].ToString(), "File", StringComparison.InvariantCultureIgnoreCase))
return false;
}
return true;
}
public override bool UseBufferedOutputStream(HttpResponseMessage response) {
return base.UseBufferedOutputStream(response);
}
}
在注册方法中添加以下内容-
GlobalConfiguration.Configuration.Services.Replace(typeof(IHostBufferPolicySelector), new NoBufferPolicySelector());
希望这对在那里的人有帮助。
答案 3 :(得分:-1)
一个选项是使用AjaxControlToolkit的最新版本,它在文件上传控件中支持“chunking”,即使用html5文件api将文件拆分为较小的块并发送给它。
我不知道这是否适用于总文件大小问题,但值得研究?
http://stephenwalther.com/archive/2013/04/30/april-2013-release-of-the-ajax-control-toolkit.aspx