В моем проекте Angular JS у меня есть <a>
тег привязки, который при нажатии делает HTTP- GET
запрос к методу WebAPI, который возвращает файл.
Теперь я хочу, чтобы файл был загружен пользователю после успешного запроса. Как я могу это сделать?
Тег привязки:
<a href="#" ng-click="getthefile()">Download img</a>
AngularJS:
$scope.getthefile = function () {
$http({
method: 'GET',
cache: false,
url: $scope.appPath + 'CourseRegConfirm/getfile',
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
}).success(function (data, status) {
console.log(data); // Displays text data if the file is a text file, binary if it's an image
// What should I write here to download the file I receive from the WebAPI method?
}).error(function (data, status) {
// ...
});
}
Мой метод WebAPI:
[Authorize]
[Route("getfile")]
public HttpResponseMessage GetTestFile()
{
HttpResponseMessage result = null;
var localFilePath = HttpContext.Current.Server.MapPath("~/timetable.jpg");
if (!File.Exists(localFilePath))
{
result = Request.CreateResponse(HttpStatusCode.Gone);
}
else
{
// Serve the file to the client
result = Request.CreateResponse(HttpStatusCode.OK);
result.Content = new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read));
result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = "SampleImg";
}
return result;
}
c#
javascript
html
angularjs
asp.net-web-api
whereDragonsDwell
источник
источник
Ответы:
Поддержка загрузки двоичных файлов при использовании ajax невелика, она все еще находится в стадии разработки в виде рабочих проектов .
Простой способ загрузки:
Вы можете заставить браузер загрузить запрошенный файл, просто используя приведенный ниже код, и он поддерживается во всех браузерах и, очевидно, вызовет запрос WebApi точно так же.
Метод загрузки двоичного файла Ajax:
Использование ajax для загрузки двоичного файла может быть выполнено в некоторых браузерах, и ниже представлена реализация, которая будет работать в последних версиях Chrome, Internet Explorer, FireFox и Safari.
Он использует
arraybuffer
тип ответа, который затем преобразуется в JavaScriptblob
, который затем либо представляется для сохранения с использованиемsaveBlob
метода - хотя в настоящее время он присутствует только в Internet Explorer - либо превращается в URL-адрес данных большого двоичного объекта, который открывается браузером, вызывая диалоговое окно загрузки, если MIME-тип поддерживается для просмотра в браузере.Поддержка Internet Explorer 11 (исправлено)
Примечание. Internet Explorer 11 не любил использовать эту
msSaveBlob
функцию, если она была псевдонимом - возможно, это функция безопасности, но, скорее, недостаток. Таким образом, использованиеvar saveBlob = navigator.msSaveBlob || navigator.webkitSaveBlob ... etc.
для определения доступнойsaveBlob
поддержки вызвало исключение; поэтому код ниже теперь проверяетсяnavigator.msSaveBlob
отдельно. Спасибо? MicrosoftИспользование:
Ноты:
Вам следует изменить свой метод WebApi, чтобы он возвращал следующие заголовки:
Я использовал
x-filename
заголовок для отправки имени файла. Это настраиваемый заголовок для удобства, однако вы можете извлечь имя файла изcontent-disposition
заголовка, используя регулярные выражения.Вы также должны установить
content-type
заголовок mime для своего ответа, чтобы браузер знал формат данных.Надеюсь, это поможет.
источник
window.open
.C # WebApi PDF скачать все работает с Angular JS Authentication
Контроллер веб-API
Сервис Angular JS
Любой будет делать
Angular JS Controller вызывает службу
И последняя HTML-страница
Это будет отредактировано, просто поделившись кодом, теперь надеюсь, что это поможет кому-то, поскольку мне потребовалось время, чтобы заставить это работать.
источник
Для меня Web API был Rails и на стороне клиента Угловая используется с Restangular и FileSaver.js
Веб-API
HTML
Угловой контроллер
Угловой сервис
источник
Нам также пришлось разработать решение, которое будет работать даже с API, требующими аутентификации (см. Эту статью ).
Вкратце об использовании AngularJS вот как мы это сделали:
Шаг 1: Создайте специальную директиву
Шаг 2: Создайте шаблон
Шаг 3. Используйте это
Это отобразит синюю кнопку. При нажатии будет загружен PDF-файл (Внимание: серверная часть должна доставить PDF-файл в кодировке Base64!) И помещен в href. Кнопка становится зеленой, и текст меняется на « Сохранить» . Пользователь может щелкнуть еще раз, и будет представлен стандартный диалог загрузки файла my-awesome.pdf .
источник
Отправьте файл в виде строки base64.
Если метод attr не работает в Firefox, вы также можете использовать метод javaScript setAttribute
источник
Вы можете реализовать функцию showfile, которая принимает параметры данных, возвращаемых из WEBApi, и имя файла для файла, который вы пытаетесь загрузить. Я создал отдельную службу браузера, которая идентифицирует браузер пользователя и затем обрабатывает рендеринг файла на основе браузера. Например, если целевой браузер на ipad является chrome, вы должны использовать объект FileReader javascripts.
источник
Я прошел через множество решений, и это то, что я обнаружил, отлично мне помогло.
В моем случае мне нужно было отправить почтовый запрос с некоторыми учетными данными. Небольшие накладные расходы заключались в добавлении jquery внутри скрипта. Но оно того стоило.
источник
В вашем компоненте, т.е. угловом коде js:
источник