【问题标题】:Why is Request.Files.Count sometimes 0 using HTML5 uploader?为什么使用 HTML5 上传器时 Request.Files.Count 有时为 0?
【发布时间】:2015-08-20 17:50:05
【问题描述】:

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

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

【问题讨论】:

  • 您是否始终使用同一个文件进行测试?如果不同的文件,是否有任何文件类型可能导致错误的模式?
  • 另外,我们能看到实际的 HTML 吗?
  • 我应该更清楚。这是在生产环境中,用户正在上传文件。大多数文件是 .ppt、.pptx 或 .pdf,但我们接受很多文件类型。我们不知道错误的文件类型。 HTML 是 plupload 的标准,插件完成了大部分繁重的工作。
  • 如果您的 TotalBytes (收到的实际字节数)小于您的 ContentLength (将整个文件发送到服务器所需的总字节数),情况似乎是这样,在服务器接收到整个文件之前,您要么在用户端或网络某处超时,要么上传插件中的问题导致上传在某些情况下过早终止。

标签: asp.net vb.net html plupload


【解决方案1】:

当用户中止上传(通常由“远程主机关闭连接。”异常表示)遇到网络延迟时,可能会发生故障,可能是由于 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 设置来控制它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多