使用jquery Ajax处理动态HTTP Content-Type

时间:2012-06-22 04:54:51

标签: javascript jquery perl http

我有一个perl脚本URL,它为我提供了一个ZIP文件,它处理数据并在http-header中动态设置Content-Type'application/zip'

Perl代码如下所示:

WPHTTPResponse::setHeader( 'Content-disposition', 'attachment;filename="test.zip"');
WPHTTPResponse::setHeader( 'Content-type', 'application/zip');  
print $result;

在前端,我直接在HREF中使用这个脚本:

      <a href="/script">Download</a>

但是如果perl脚本中$result为NULL,我需要显示警告消息。

我的想法是:如果$ result不为null,我将发送带有Content-Type=>application/zip的文件,否则我将发送JSON响应,并显示没有要下载文件的错误消息。

为此,我需要使用JS动态检查内容类型:

$.ajax({
  url: '/script',
  data: {....},
  success: function(response) {
     if(response.contentType == 'application/zip'){
        //download using javascript
     }
     else{
        $.parseJSON(response);
        alert(response.msg);
     }
  }
});

我很感激任何帮助。

2 个答案:

答案 0 :(得分:1)

虽然你的方法应该可行,但这种情况下使用HTTP错误代码可能是一个不错的选择。

根据$ result为null的原因,其中一个应该是合适的。

400 Bad Request
406 Not Acceptable
410 Gone

这将使您的代码稍微“显而易见”,因为您将HTTP状态用于其目的,而不是在代码中以专有方式重新实现完全相同的东西。恕我直言,它也会使你的代码更容易维护,因为它会将成功与错误分开。

您仍然可以将JSON作为错误响应的一部分包含在内,以便能够显示有关请求未导致任何数据返回给客户端的确切原因的信息。

btw我会避免使用404作为错误代码,即使它在技术上是最“合适”的代码,只是因为如果发生真正的404错误会导致混淆。

答案 1 :(得分:1)

使用HEAD - 请在下载前检查内容大小。

客户端:

  • click - 事件处理程序附加到<a> - 元素。
  • click - 事件发送HEAD - 请求投掷XHR
  • XHR - 回复检查内容大小。
  • 如果size为零,则显示alert并阻止默认事件处理程序。
  • 如果尺寸不为零,则无事可做。

服务器端:

  • HEAD上计算内容大小 - 请求。