2017-02-02 4 views
0

Когда я инициирую запрос get в угловом формате с контроллером webapi, который отвечает файлом, завернутым в HttpResponseMessage, браузер не распознает, что это загрузка файла, и данные теряются.Angular is blocking file загрузить

Я проверил в скейтборде, и я вижу, что двоичные данные присутствуют в ответе.

Я инициируя запрос GET с этим:

 return $http.get(serviceURLRoot + 'api/myreport/' + dateParams.StartDate + '/' + dateParams.EndDate, { withCredentials: true }).success(function (data) { 
     }); 

Если я набираю запрос непосредственно в адресную строку я получаю файл обратно просто отлично. Использование window.open также работает:

window.open(serviceURLRoot + 'api/rawdatareport/' + dateParams.StartDate + '/' + dateParams.EndDate); 

Почему не $http.get работы?

EDIT -----

Вот HttpResponseMessage, как построен на сервере:

HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 
result.Content = new ByteArrayContent(pck.GetAsByteArray()); 
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { 
    FileName = "myReport.xlsx" 
}; 

return result; 
+0

Что вы делаете с ответом? Ajax сам по себе не будет инициализировать диалог сохранения файла – charlietfl

+0

@charlietfl Я не уверен, имеете ли вы значение на сервере или клиенте. Я обновил вопрос, чтобы показать, как ответ создается на сервере. На стороне клиента это просто показание 'return $ http.get', ничего не исчезло. – Legion

ответ

0

Потому что вы делаете запрос AJAX с $ HTTP. Единственный способ, с помощью которого браузер собирается реализовать файл, - это открыть браузер. Реализация файла идет, а не HTML, он выводит загрузку. Поэтому вам действительно нужно изменить местоположение на этот URL или открыть новое окно в этом URL-адресе.

+0

есть способы делать загрузки с помощью ajax, ответ немного неточен и неполный – charlietfl

+0

Так что 'window.open' - правильный способ сделать это? – Legion

+0

или 'window.location', да. Вы можете увидеть похожие ответы здесь: http://stackoverflow.com/q/20830309/1658906 и здесь: http://stackoverflow.com/q/4545311/1658906. – juunas