jQuery / Ajax显示另存为对话框,用于下载从servlet发送的文件

时间:2013-03-22 19:42:42

标签: java ruby-on-rails

我在网站上已经阅读了很多有关此问题的问题/答案,并且不确定其中任何一个可以解决我的问题。以下是我的应用程序应该如何工作:

  1. 该页面将显示之前已下载的服务器上可用的文件列表。
  2. 点击该页面时,按钮会向servlet发送请求,该请求将收集服务器上的数据并将其作为zip文件保存在预定义目录中。 servlet比读取文件并将其作为二进制流发送回客户端,具有以下响应内容类型和标头信息: content-type = application / octet-stream header = content-Disposition,attachment;文件名= ... header = content-type,application / x-download
  3. 要求是请求是异步的,因为servlet可能需要很长时间来收集可能超过100 MB的大量数据。
  4. 我必须在请求进行时禁用该按钮并知道请求何时完成,以便我可以将刷新发送到列表以显示新文件。
  5. 我不认为使用iframe,Window.location.href或使用html表单的解决方案将满足我的要求。如果我的问题有任何解决方案,请告诉我。非常感谢任何帮助。

    -Tam

1 个答案:

答案 0 :(得分: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);
}