我有一个 ASP.NET Web 应用程序(利用 WebForms)并且正在使用 上传 处理上传大文件。这是通过将文件发布到 HttpHandler 来完成的。

代码示例(出于演示目的而简化):

$(".uploadify").uploadify({
    'uploader': '/uploadify/uploadify.swf',
    'script': 'SaveUploadedFile.ashx',
    'cancelImg': '/uploadify/cancel.png',
    'queueID': 'fileQueue',
    'auto': true,
    'multi': false,
    'method': 'post',
    onSelect: function(e, queueId, file) {
        alert(file.name + " selected");
    },
    onComplete: function(e, queueId, file, response, data) {
        alert("complete: " + response);
    },
    onCancel: function(e, queueId, file, data) {
        alert("cancel");
    }
});

接收文件的 HttpHandler 相当简单:

public void ProcessRequest(HttpContext context)
{
    Debug.WriteLine("Save file");

    if (context.Request.Files.Count == 0)
        throw new SystemException("No files uploaded");

    // Get the file
    HttpPostedFile file = context.Request.Files.Get(0);
    Debug.WriteLine("Got file: " + file.FileName + ", Length: " + file.ContentLength);

    // Save it
    string guid = Guid.NewGuid().ToString();
    string path = Path.Combine(Path.GetTempPath(), guid + ".tmp");
    file.SaveAs(path);
    Debug.WriteLine("Saved to path: " + path);

    // Update response and return guid
    context.Response.StatusCode = 200;
    context.Response.Write(guid);

    Debug.WriteLine("All Done");
}

问题在于,显示的进度条实际上并不反映上传进度,而是在文件实际上传之前很久就显示上传已完成。因此,用户界面实际上看起来就像什么都不做,而进度条保持在 100%,直到文件完成。

在某些情况下,上传在达到 100% 后就会失败,并且 OnComplete 事件永远不会被触发,几乎就像 HttpHandler 的响应在传输过程中丢失一样,即使文件已保存。

我都尝试过 弗拉贾西安SWF上传, ,并且遇到了类似的问题,进度条与实际上传进度完全不同步,在上传实际完成之前就指示完成。

在本地测试或使用小文件(通常在几兆字节以下)进行测试时,此问题并不明显,因为这些文件往往上传得相当快,并且上传的文件和进度条完成之间几乎没有延迟。

有没有办法将 Flash 上传解决方案(例如 Uploadify)与 ASP.NET Web 应用程序一起使用,并且让进度条更好地代表上传的实际进度?

更新: 最终,我放弃了尝试使用基于 Flash 的上传器,因为它们看起来有点太尴尬了,尤其是进度条,它根本不代表上传的实际进度。将此替换为 Brettle Neat上传 相反,效果更好。

有帮助吗?

解决方案

这可能是您的防病毒软件(特别是 AVG)及其上传代理或防火墙的问题。这是一个相关问题:

每个 Flash 上传器都会给出错误的进度值

其他提示

你的问题似乎很常见。我会给 http://www.swfupload.org/ 尝试一下。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top