2012-06-22 3 views
0

У меня есть URL-адрес скрипта perl, который дает мне ZIP-файл, обрабатывает данные и динамически устанавливает Content-Type в 'application/zip' в http-заголовке.Обработка динамического содержимого HTTP-содержимого с помощью jquery Ajax

код Perl выглядит следующим образом:

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

В веб-интерфейсе, я использую этот скрипт прямой в HREF:

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

Но у меня есть требование показывать предупреждающее сообщение, если $result является NULL в perl-скрипте.

Я думаю, что я отправлю файл с Content-Type=>application/zip, если $ result, если не null, в противном случае я отправлю ответ JSON с сообщением об ошибке, что нет файла для загрузки.

Для этого мне нужно будет динамически проверять тип содержимого с помощью JS:

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

Я был бы признателен за любую помощь.

ответ

1

Хотя ваш метод должен работать, это случай, когда использование кодов ошибок HTTP, вероятно, будет хорошим выбором.

В зависимости от того, почему $ result является null, одно из них должно быть уместным.

400 Bad Request 
406 Not Acceptable 
410 Gone 

Это позволит сделать ваш код немного более «очевидным», как вы будете использовать статус HTTP именно то, что она была предназначена для, а не повторно реализует ту же самую вещь в собственность, как в вашем коде. ИМХО, это также сделало бы ваш код немного легче поддерживать, поскольку он отделяет успех от ошибки.

Вы все еще можете включить JSON как часть ответа об ошибке, чтобы иметь возможность отображать информацию о том, почему запрос не привел к возврату данных клиенту.

btw Я бы не использовал 404 в качестве кода ошибки, хотя это технически самый «подходящий» код только потому, что он может вызвать путаницу, если произошла настоящая ошибка 404.

1

Используйте HEAD -request для проверки размера содержимого перед загрузкой.

стороне клиента:

  • Присоединить click -Event обработчик <a> -элемента.
  • На click - отправьте письмо HEAD -пробейте запрос XHR.
  • XHR -отчет содержания содержимого.
  • Если размер равен нулю, тогда выведите предупреждение и предотвратите обработчик события по умолчанию.
  • Если размер не равен нулю, нечего делать.

стороне сервера:

  • Вычисление размера содержимого на HEAD -request.
Смежные вопросы