Попытка загрузить файл с jQuery.ajax приводит к ошибке - PullRequest
0 голосов
/ 06 октября 2018

У меня есть служба WCF, которая использует OWIN для аутентификации, поэтому мне нужно отправлять заголовок Authorization: Bearer <access_key> с каждым запросом.По этой причине я не могу использовать традиционную скрытую форму + iframe для загрузки файла и должен использовать для этого вызов AJAX.Основываясь на этом ответе , я написал такой код:

var header = "Bearer reallylongaccesskey";
var serviceUrl = "http://mywcfserviceurl";
var downloadToken = Date.now();

$.ajax(url + "&downloadToken=" + downloadToken, {
    beforeSend: function (xhr, settings) {
        showWaitingMessage(null, "Exporting...");
        if (this.url && this.url.toLowerCase().indexOf(serviceUrl) >= 0) {
          xhr.setRequestHeader('Authorization', header);
        }
        return true;
    },
    cache: false,
    complete: function(xhr, textStatus) {
        closeWaitingMessage();
        document.cookie = "downloadToken=''"; //the server returns the downloadToken as a cookie which is cleared here.
        //this was part of the previous form+hidden iframe implementation
    },
    data: { paramStr: jsonStr },
    dataType: "text",
    error: ajaxException,
    traditional: true,
    type: "POST",
    success: function(data, textStatus, xhr) {
        var contentType = xhr.getResponseHeader("content-type");
        var blob = new Blob([data], { type: contentType });
        var contentDisposition = xhr.getResponseHeader("Content-Disposition");
        var fileName = contentDisposition.substring(contentDisposition.indexOf("=") + 1);
        window.navigator.msSaveOrOpenBlob(blob, fileName);
    },
    timeout: 300000,
    xhrFields: {
        responseType: "blob"
    }
});

Я могу отслеживать запрос к серверу, файл генерируется и возвращается, и на панели инструментов разработчика IE F12 я могувидеть статус ответа 200 OK с правильными заголовками ответа, но каким-то образом вызывается только обратный вызов error с xhr.status = 0, а не обратный вызов success.

Это предназначено для использованияс IE11 только на этом этапе (интранет компании), поэтому HTMLAnchorElement.download не поддерживается.

В настоящее время я ограничен jQuery 1.7.1.

Что я делаю не так?

...