8

我有一个需要上传超过 2GB 的 (.iso) 文件的 Intranet 应用程序。看来 2GB 文件大小有许多限制因素。

  1. IE 内有浏览器限制,只有 IE 9/10 可以超过 2GB根据 Eric Law
  2. httpRuntimemaxRequestLength元素为Int32类型,最大值为2097151,约2GB。

看来您可以使用 maxAllowedContentLength 将另一个文件大小限制设置为大约 4GB,因为它是 uint 类型,但是当我们仍然受到 maxRequestLength 的 2GB 限制时,这有什么好处呢?

<system.webServer>
  <security>
    <requestFiltering>
      <requestLimits maxAllowedContentLength="4294967295" />
    </requestFiltering>
  </security>
<system.webServer>

有没有人有上传文件超过 2GB 限制的解决方案?

4

3 回答 3

4

你愿意接受 JavaScript 解决方案吗??如果是这种情况,试试这个jQuery 插件,它允许你上传海量数据(很多 GB)。如果浏览器不支持提供基于 TCP/IP 发送和接收具有相应 ACK 的包的机制,它会使用 HTML5 FileReader API 功能和 Silverlight 后备来上传文件。文件按配置大小的块上传(默认为 4 MB)。

另外:它还带有文件队列模式。

以下是如何在 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("");
    }
于 2013-05-24T15:57:11.423 回答
3

通过进行以下更改,我能够使用 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());

希望这可以帮助那里的任何人。

于 2019-03-04T06:40:57.077 回答
1

今年我一直在为从各种浏览器上传到 IIS 服务器的大文件而奋斗。这是我发现的:

自 .Net 4.5 起,ASP.NET 支持超过 2Gb 的上传(可能它支持最高long.MaxValue. 但是 IIS 本身不支持超过 2Gb 的上传。因此,IIS 中托管的任何服务器都不支持超过 2Gb 的上传。

据我了解,设置maxAllowedContentLengthmaxRequestLength超过 2Gb 的值无济于事,因为这些设置适用于 ASP.NET,而核心问题在于 IIS。

于 2013-09-23T18:07:23.320 回答