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

时间:2015-06-05 17:16:28

标签: asp.net vb.net html5 plupload

我们正在使用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不同,但在我的本地测试中它们是相同的。这可能是个问题吗?

在这个问题上坚持了几天,没有任何好的线索。

1 个答案:

答案 0 :(得分:4)

当用户中止上传时(通常由“远程主机关闭连接。”异常表示),可能会发生故障,可能是来自HTTP超时的网络延迟,甚至可能是Plupload代码的问题。我很抱歉没有具体说明原因,但我相信我可以通过提供可以限制用户在您网站上遇到的问题的解决方案来弥补这一点。

Plupload包含一个设置,该设置将在遇到HTTP错误响应时重试上载。使用max_retries设置,以便在存在“网络打嗝”的情况下,执行另一次尝试(或少数)以重试上载。当然,您仍会看到异常,但这可能会阻止用户再次单击上传按钮。

您的代码将成为:

  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'
});

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