1

我已经在网站上阅读了很多关于这个问题的问题/回答者,但不确定他们中的任何一个都可以解决我的问题。以下是我的应用程序应该如何工作:

  1. 该页面将显示之前已下载的服务器上可用文件的列表。
  2. 该页面还将有一个按钮,单击该按钮将向 servlet 发送请求,该 servlet 将收集服务器上的数据并将其保存为预定义目录中的 zip 文件。然后,servlet 读取文件并将其作为二进制流发送回客户端,其中包含以下响应内容类型和标头信息: content-type = application/octet-stream header=content-Disposition, attachment; 文件名=...标头=内容类型,应用程序/x-下载
  3. 要求是请求是异步的,因为 servlet 可能需要很长时间才能收集可能超过 100 MB 的大量数据。
  4. 我必须在请求进行时禁用按钮并知道请求何时完成,以便我可以将刷新发送到列表以显示新文件。

我认为使用 iframe、Window.location.href 或使用 html 表单的解决方案不能满足我的要求。如果我的问题有任何解决方案,请告诉我。任何帮助是极大的赞赏。

-谭

4

1 回答 1

0

正如您在问题标题中所写的那样,我建议您使用一些 javascript,无论是 JQuery 还是原型都可以完成这项工作。

由于我对最后一个了解更多,因此我将提供一些代码

这是我对您的情况了解的过程。

首先,您的服务器发送一个带有表单的页面。然后用户选择一个文件并单击发送按钮,页面不会重新加载并使用 Ajax 完成工作然后 JQuery 获取数据并通过 Ajax ( request();) 将其发送到您的服务器,然后服务器将结果发回,您可以显示它displayFilesList();

your_form_id是您的表单 ID

submitForm是提交表单时调用的函数的名称

displayFilesList将是您的服务器发回结果时调用的函数,此函数还希望您以 json 格式发回结果

$('#your_form_id').submit(submitForm);

function submitForm()
{
    var data = $('#your_form_id').serializeArray();
    //Code to remove the send button here
    //Code to insert a loading.gif
    request("/your/url", data, displayFilesList);
    return false;
}

function    displayFilesList(jsonResult)
{
    var data = jQuery.parseJSON(jsonResult);
    //Code to display the files list here
    //
}

function    request(url, paramPost, successCallback, errorCallback)
{
    if ((typeof successCallback == 'undefined') || (successCallback == null))
        successCallback = dispSuccess;
    if ((typeof errorCallback == 'undefined') || (errorCallback == null))
        errorCallback = dispError;

    var AjaxUrl = url;

    $.ajax({    
            type: "POST",
            url: AjaxUrl,
            data: paramPost
           }
          ).done( function(msg)
                  {
                       successCallback(msg);
                  }
          ).fail( function(jqXHR, textStatus, errorThrown)
                  {
                       errorCallback(jqXHR, textStatus, errorThrown);
                  }
          );
}

function    dispError(jqXHR, textStatus, errorThrown)
{
    alert(jqXHR.responseText);
}
function    dispSuccess(html)
{
    alert(html);
}
于 2013-03-22T20:36:32.233 回答