为什么 Request.Files.Count 有时 0 使用 HTML5 上传器?

Why is Request.Files.Count sometimes 0 using HTML5 uploader?

我们正在使用 plupload 供用户将文件上传到我们的 VPS。

这里是plupload代码:

 var uploader = new plupload.Uploader({
    browse_button: 'fileSelectorLink',
    container: 'uploadContainer',
    drop_element: 'uploadbox',
    url: '/UploadHandler.ashx',
    unique_names: true,
    multi_selection: false,
    flash_swf_url: '/scripts/plupload/js/Moxie.swf',
    silverlight_xap_url: '/scripts/plupload/js/Moxie.xap'
});

他是处理请求的代码:

Public Sub ProcessRequest(context As HttpContext) Implements IHttpHandler.ProcessRequest
  Dim runtime As String = If(context.Request("runtime") IsNot Nothing, context.Request("runtime"), "Unknown")
  If context.Request IsNot Nothing Then
    If context.Request.Files.Count > 0 Then
       Dim fileUpload As HttpPostedFile = context.Request.Files(0)
       ...
    Else
       ' Throw an exception
  End If
End Sub

偶尔(大约 2% 的时间)会抛出异常。以下是引发错误的请求示例:

Runtime: html5
Request.ContentType: multipart/form-data; boundary=----WebKitFormBoundaryo7JAtlhKsg8xDcQT
Request.ContentLength: 3758089
Request.ContentEncoding: System.Text.SBCSCodePageEncoding
Request.TotalBytes: 3179067

这些错误似乎发生在不同的浏览器和操作系统(甚至是现代浏览器)中,所以这似乎不是问题所在。如果浏览器不处理异步文件上传,Plupload 应该退回到其他版本。我认为 ContentEncoding 看起来很奇怪,但它似乎总是这样说(也许 plupload 就是这样工作的?)。唯一让我吃惊的是 ContentLength 和 TotalBytes 不同,但在我的本地测试中它们是相同的。这会是个问题吗?

在这个问题上卡了几天,一直没有好的线索。

当用户中止上传时(通常由 "The remote host closed the connection." 异常指示)、遇到网络延迟(可能是 HTTP 超时)、甚至可能是 Plupload 代码问题,可能会发生故障。很抱歉没有具体说明原因,但我相信我可以通过提供一种解决方案来弥补这一点,该解决方案可以限制用户在您网站上遇到的问题。

Plupload 包含在遇到 HTTP 错误响应时重试上传的设置。使用 max_retries 设置,以便在存在 "network hiccup" 的情况下,进行另一次(或几次)尝试 is/are 以重试上传。当然,您仍然会看到例外情况,但这可能会阻止用户再次单击上传按钮。

您的代码将变为:

  var uploader = new plupload.Uploader({
    browse_button: 'fileSelectorLink',
    max_retries: 2,
    container: 'uploadContainer',
    drop_element: 'uploadbox',
    url: '/UploadHandler.ashx',
    unique_names: true,
    multi_selection: false,
    flash_swf_url: '/scripts/plupload/js/Moxie.swf',
    silverlight_xap_url: '/scripts/plupload/js/Moxie.xap'
});

此外,您可以使用二进制流而不是多部分 post 文件,这可能会缓解旧版浏览器的问题。您可以使用 multipart 设置来控制它。