0

我有一个与使用 POST 下载文件有关的问题。

我有以下 javascript 向服务器端发送 POST 请求以下载文件:

function postCall(url, params) {
    function doPostCall() {
    var newForm = jQuery('<form>', {
        'method':'POST',
        'action': url
    });

    for(key in params) {
        if (params.hasOwnProperty(key)) {
            newForm.append(jQuery('<input>', {
                'name': key,
                'value': params[key],
                'type': 'hidden'
            }));
        }
    }
    newForm.appendTo("body").submit();
}

从 HTML 页面中的不可见 iframe 调用此方法。这个页面还有另一个普通的 GET 请求来获取静态 HTML。但是,每次调用上述方法时,获取静态页面的调用永远不会从服务器端返回。

我知道用这么少的信息有点难以理解,但是代码很大而且很难放在这里。我的问题是:

  1. 上面使用不可见表单发送 POST 请求以获取文件的代码有什么明显的问题吗?
  2. 有没有其他更好的方法可以向服务器发送 POST 请求以下载文件。(人们说不能使用 Ajax 调用来下载文件)?
  3. 如果此代码正常且没有其他方法可用。在整个页面加载完成并且所有其他请求都完成后,是否有强制此方法在最后一件事上运行?
4

1 回答 1

0
  1. 从 GET 请求中的描述不是很清楚是否从同一个 iframe 发送。是的,然后在提交表单后重新加载 iframe 内容 - 因为它不是 AJAX 请求 - 停止在 iframe 中运行的所有其他 javascript 代码。

  2. 好吧,您可以将 'target="_blank"' 属性添加到表单 - 在这种情况下,iframe 内容不会在表单提交时重新加载。

  3. 是的,这很有可能。jQuery.ajax 方法返回 Deferred 对象。因此,您可以将这些延迟对象存储在数组变量中,并等待所有延迟对象都已解决。然后才运行 POST 提交。 jquery.whenAll插件可以简化这个任务:

    jQuery.whenAll(
      $.get( URL1 ),
      $.get( URL2 )
    )
    .always(function(results) { postCall(url, params) });
    
于 2013-08-02T15:26:35.393 回答