为什么 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 设置来控制它。
我们正在使用 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 设置来控制它。