0

我有一个 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>

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

我在想的是:Content-Type=>application/zip如果 $result 不为空,我将发送文件,否则我将发送 JSON 响应,其中包含没有文件可下载的错误消息。

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

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

我会很感激任何帮助。

4

2 回答 2

1

尽管您的方法应该有效,但在这种情况下,使用 HTTP 错误代码可能是一个不错的选择。

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

400 Bad Request
406 Not Acceptable
410 Gone

这将使您的代码更加“明显”,因为您将使用 HTTP 状态来准确地表达它的含义,而不是在代码中以专有方式重新实现完全相同的东西。恕我直言,它还会使您的代码更易于维护,因为它将成功与错误分开。

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

顺便说一句,我会避免使用 404 作为错误代码,即使它在技术上是最“合适”的代码,只是因为如果发生真正的 404 错误会引起混淆。

于 2012-06-22T05:42:01.617 回答
1

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

客户端:

  • click-event 处理程序附加到 -element <a>
  • On click-event 发送HEAD-request throw XHR
  • 响应XHR检查内容大小。
  • 如果大小为零,则显示警报并阻止默认事件处理程序。
  • 如果大小不为零,则无事可做。

服务器端:

  • 根据请求计算内容大小HEAD
于 2012-06-22T05:51:43.650 回答