使用 Valums 在 Chrome 中上传大文件失败

Posted

技术标签:

【中文标题】使用 Valums 在 Chrome 中上传大文件失败【英文标题】:Large File Uploads Fails in Chrome with Valums 【发布时间】:2012-01-15 17:33:51 【问题描述】:

我正在使用 valums ajax 上传组件 (http://valums.com/ajax-upload/)。我的网站将让用户上传大小超过 500MB 的文件。我有严格的纯 html 要求。我可以在 Internet Explorer 中成功上传这种大小的文件。但是,当我尝试使用 Chrome 时,该文件永远不会写入服务器,而只是在大文件的情况下。对于较小的文件,文件被成功写入。但对于较大的文件,我收到“超出最大请求长度错误”。

考虑到我可以用 IE 上传这种大小的文件,我知道我的 web.config 中的设置是正确的。这让我相信 XHR 实现中有些东西需要设置以适应这种大小的文件。但是,我不确定那是什么。任何人都可以提供与 ASP.NET MVC 一起使用的值示例:

允许在 IE 和 Chrome 中上传大型 (>500 mb) 文件 在支持 XHR 的浏览器中显示上传文件的进度

非常感谢!

【问题讨论】:

您是否将“超出最大请求长度错误”视为黄屏死机? 【参考方案1】:

我无法重现您的问题。这是我将文件限制为 1GB 的设置。

控制器:

public class HomeController : Controller

    public ActionResult Index()
    
        return View();
    

    [HttpPost]
    public ActionResult Upload(string qqfile)
    
        var path = Server.MapPath("~/App_Data");
        var file = Path.Combine(path, qqfile);
        using (var output = System.IO.File.OpenWrite(file))
        
            Request.InputStream.CopyTo(output);                
        
        return Json(new  success = true );
    

Index.cshtml查看:

@
    Layout = null;

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Test</title>
    <link href="@Url.Content("~/Content/fileuploader.css")" rel="stylesheet" type="text/css" />
</head>
<body>
    <div id="file-uploader">       
        <noscript>          
            <p>Please enable javascript to use file uploader.</p>
        </noscript>         
    </div>
    <script src="@Url.Content("~/Scripts/fileuploader.js")" type="text/javascript"></script>
    <script type="text/javascript">
        var uploader = new qq.FileUploader(
            element: document.getElementById('file-uploader'),
            action: '@Url.Action("upload")'
        );
    </script>
</body>
</html>

web.config:

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="webpages:Version" value="1.0.0.0"/>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
  </appSettings>

  <system.web>

    <httpRuntime maxRequestLength="1048576" executionTimeout="3600" />

    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>

    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages"/>
      </namespaces>
    </pages>
  </system.web>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="1073741824" />
      </requestFiltering>
    </security>
  </system.webServer>

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

web.config 中需要注意的是&lt;httpRuntime&gt;:

<httpRuntime maxRequestLength="1048576" executionTimeout="3600" />

如果您在 IIS7+ (&lt;requestLimits&gt;) 中托管此站点,则也是必需的:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="1073741824" />
      </requestFiltering>
    </security>
</system.webServer>

通过此设置,我可以在最新版本的 FireFox 8.0、IE9 和 Chrome 16 中上传最大 1GB 的文件。

我已使用 IIS Express 在本地托管该站点。

【讨论】:

以上是关于使用 Valums 在 Chrome 中上传大文件失败的主要内容,如果未能解决你的问题,请参考以下文章

Rails Valums Ajax 上传

大文件上的 JQuery Ajax 文件上传失败

上传文件到服务器并发送邮件

将大文件切成块并使用 ajax 和 html5 FileReader 上传

java大文件分片上传插件

如何在我自己的代码中使用 Google Chrome 11 的上传文件夹功能?