У меня есть приложение WebApi / MVC, для которого я разрабатываю клиент angular2 (вместо MVC). У меня возникли проблемы с пониманием того, как Angular сохраняет файл.
Запрос в порядке (отлично работает с MVC, и мы можем регистрировать полученные данные), но я не могу понять, как сохранить загруженные данные (я в основном следую той же логике, что и в этом посте ). Я уверен, что это глупо просто, но пока я просто не понимаю этого.
Код функции компонента приведен ниже. Я пробовал различные варианты, блоб путь должен быть путем, насколько я понял, но нет никакой функции createObjectURL
в URL
. Я даже не могу найти определение URL
в окне, но, видимо, оно существует. Если я использую FileSaver.js
модуль, я получаю ту же ошибку. Так что я думаю, что это то, что изменилось недавно или еще не реализовано. Как мне запустить сохранение файла в A2?
downloadfile(type: string){
let thefile = {};
this.pservice.downloadfile(this.rundata.name, type)
.subscribe(data => thefile = new Blob([data], { type: "application/octet-stream" }), //console.log(data),
error => console.log("Error downloading the file."),
() => console.log('Completed file download.'));
let url = window.URL.createObjectURL(thefile);
window.open(url);
}
Для полноты службы, которая извлекает данные, ниже, но единственное, что она делает, - это отправляет запрос и передает данные без сопоставления, если это удается:
downloadfile(runname: string, type: string){
return this.authHttp.get( this.files_api + this.title +"/"+ runname + "/?file="+ type)
.catch(this.logAndPassOn);
}
Ответы:
Проблема в том, что наблюдаемое работает в другом контексте, поэтому при попытке создать переменную URL-адреса у вас появляется пустой объект, а не нужный вам большой двоичный объект.
Один из многих способов решить эту проблему заключается в следующем:
Когда запрос будет готов, он вызовет функцию «downloadFile», которая определяется следующим образом:
BLOB-объект был создан идеально, поэтому URL-адрес var, если не открывается новое окно, проверьте, что вы уже импортировали 'rxjs / Rx';
Я надеюсь это тебе поможет.
источник
this._reportService.getReport()
и что оно возвращает?getReport()
возвращаетсяthis.http.get(PriceConf.download.url)
Попробуй это !
1 - Установить зависимости для показа сохранения / открытия файла
2- Создать сервис с этой функцией для получения данных
3- В компоненте проанализируйте BLOB-объект с помощью «File-Saver»
Это работает для меня!
источник
Если вам не нужно добавлять заголовки в запрос, скачать файл в Angular2 вы можете просто :
в вашем компоненте.
источник
authHttp
!Это для людей, которые ищут, как это сделать, используя HttpClient и File-Saver:
Класс обслуживания API:
Составная часть:
источник
Как насчет этого?
Я мог бы сделать с этим.
нет необходимости в дополнительном пакете.
источник
Как упомянуто Алехандро Корредором это простая ошибка.
subscribe
Выполняется асинхронно иopen
должен быть помещен в этот контекст, чтобы данные заканчивали загрузку, когда мы запускаем загрузку.Тем не менее, есть два способа сделать это. Как рекомендуют документы, служба заботится о получении и сопоставлении данных:
Затем на компонент мы просто подписываемся и имеем дело с сопоставленными данными. Есть две возможности. Первый , как предлагается в оригинальном посте, но нуждается в небольшой коррекции, как отметил Алехандро:
Второй способ - использовать FileReader. Логика та же, но мы можем явно ждать, пока FileReader загрузит данные, избегая вложения и решая проблему асинхронности.
Примечание. Я пытаюсь загрузить файл Excel, и даже если загрузка запущена (так что это отвечает на вопрос), файл поврежден. Смотрите ответ на этот пост для избежать повреждения файла.
источник
res
в BLOB-объект и действительно хотитеres._body
. Однако_body
это закрытая переменная и не доступна. На сегодняшний день.blob()
и.arrayBuffer()
на объекте ответа HTTP не были реализован в угловом 2.text()
иjson()
являются только два варианта , но оба будет искажать ваше тело. Вы нашли решение?<a href=""></a>
для загрузки файла.Загрузите * .zip решение для angular 2.4.x: вы должны импортировать ResponseContentType из '@ angular / http' и изменить responseType на ResponseContentType.ArrayBuffer (по умолчанию это ResponseContentType.Json)
источник
Для более новых угловых версий:
источник
Загрузка файла через ajax всегда является болезненным процессом, и, на мой взгляд, лучше всего позволить серверу и браузеру выполнять эту работу по согласованию типа контента.
Я думаю, что лучше всего иметь
сделать это. Это даже не требует открытия новых окон и тому подобного.
Контроллер MVC, как в вашем примере, может быть похож на приведенный ниже:
источник
Я использую Angular 4 с объектом httpClient 4.3. Я изменил ответ, который нашел в техническом блоге Js, который создает объект ссылки, использует его для загрузки, а затем уничтожает его.
Клиент:
Значение this.downloadUrl было установлено ранее, чтобы указывать на API. Я использую это для загрузки вложений, поэтому я знаю идентификатор, contentType и имя файла: я использую API MVC, чтобы вернуть файл:
Класс вложения выглядит так:
Репозиторий filerep возвращает файл из базы данных.
Надеюсь, это поможет кому-то :)
источник
Для тех, кто использует Redux Pattern
Я добавил в заставку файл @Hector Cuevas, названный в его ответе. Используя Angular2 v. 2.3.1, мне не нужно было добавлять в @ types / file-saver.
Следующий пример - загрузить журнал в формате PDF.
Журнал действий
Журнал эффектов
Журнал службы
HTTP сервис
Журнал редуктор Хотя это только устанавливает правильные состояния, используемые в нашем приложении, я все же хотел добавить его, чтобы показать полный шаблон.
Я надеюсь, что это полезно.
источник
Я поделюсь решением, которое помогло мне (любое улучшение очень ценится)
К вашим услугам «Псервис»:
Составная часть:
В компонентной части вы вызываете сервис, не подписываясь на ответ. Подписка на полный список типов пантомимы openOffice приведена по адресу : http://www.openoffice.org/framework/documentation/mimetypes/mimetypes.html.
источник
Будет лучше, если вы попытаетесь вызвать новый метод внутри себя.
subscribe
Внутри
downloadFile(data)
функции нам нужно сделатьblock, link, href and file name
источник
Чтобы загрузить и показать файлы PDF , очень похожий отсканированный код выглядит так:
источник
Вот что я сделал в моем случае -
На решение ссылаются из - здесь
источник
Обновите ответ Гектора, используя файл-заставку и HttpClient для шага 2:
источник
Я получил решение для загрузки из Angular 2 без повреждения, используя Spring MVC и Angular 2
1-й - мой тип возврата: - ResponseEntity от конца Java. Здесь я отправляю массив byte [] имеет тип возврата из контроллера.
2-й - включить файловую заставку в вашу рабочую область - на страницу индекса как:
3-й компонент ts, напишите этот код:
Это даст вам формат файла xls. Если вы хотите, чтобы другие форматы изменили медиатип и имя файла с правильным расширением.
источник
Сегодня я столкнулся с тем же случаем, мне пришлось загрузить файл PDF в виде вложения (файл не должен отображаться в браузере, а загружаться вместо него). Чтобы добиться этого, я обнаружил, что мне нужно получить файл в формате Angular
Blob
и одновременно добавитьContent-Disposition
заголовок в ответ.Это было самое простое, что я мог получить (Angular 7):
Внутри сервиса:
Затем, когда мне нужно загрузить файл в компонент, я могу просто:
ОБНОВИТЬ:
Удалены ненужные настройки заголовка из сервиса
источник
Следующий код работал для меня
источник
До сих пор я не нашел ни ответов, ни предупреждений. Вы можете и должны следить за несовместимостью с IE10 + (если вам все равно).
Это полный пример с частью приложения и после службы. Обратите внимание, что мы установили наблюдение: «ответ», чтобы поймать заголовок для имени файла. Также обратите внимание, что заголовок Content-Disposition должен быть установлен и предоставлен сервером, иначе текущий Angular HttpClient не будет передавать его. Я добавил фрагмент кода для dotnet ниже.
Ядро Dotnet, с Content-Disposition & MediaType
источник
источник
Проще говоря,
url
какhref
показано ниже.источник
<a href="my_url" download="myfilename">Download file</a>
my_url должен иметь то же происхождение, иначе он будет перенаправлен в это место
источник
Вы также можете загрузить файл непосредственно из вашего шаблона, где вы используете атрибут загрузки, и
[attr.href]
вы можете предоставить значение свойства из компонента. Это простое решение должно работать в большинстве браузеров.Ссылка: https://www.w3schools.com/tags/att_a_download.asp
источник
Если вы отправляете параметры только на URL, вы можете сделать это следующим образом:
в сервисе, который получает параметры
источник
это ответ предполагает, что вы не можете загружать файлы напрямую с AJAX, в первую очередь из соображений безопасности. Итак, я опишу, что я делаю в этой ситуации,
01. Добавьте
href
атрибут в свой тег привязки внутриcomponent.html
файла,например: -
02. Выполните все следующие шаги,
component.ts
чтобы обойти уровень безопасности и вывести всплывающее диалоговое окно «Сохранить как»,например: -
источник
Итак, я написал фрагмент кода, вдохновленный многими из приведенных выше ответов, который должен легко работать в большинстве сценариев, когда сервер отправляет файл с заголовком расположения содержимого без каких-либо сторонних установок, кроме rxjs и angular.
Во-первых, как вызвать код из файла компонента
Как видите, это в основном средний бэкэнд-вызов из angular с двумя изменениями
После того, как файл получен с сервера, я в принципе делегирую всю задачу сохранения файла во вспомогательную функцию, которую я храню в отдельном файле, и импортирую в любой компонент, который мне нужен.
Там нет больше загадочных имен файлов GUID! Мы можем использовать любое имя, предоставленное сервером, без необходимости явно указывать его в клиенте, или перезаписать имя файла, предоставленное сервером (как в этом примере). Кроме того, можно легко, в случае необходимости, изменить алгоритм извлечения имени файла из содержимого-размещения в соответствии с их потребностями, и все остальное останется неизменным - в случае ошибки во время такого извлечения он просто пропустит 'null' как имя файла.
Как уже отмечалось в другом ответе, IE, как всегда, нуждается в особом подходе. Но с появлением хрома через несколько месяцев я бы не стал беспокоиться об этом при создании новых приложений (надеюсь). Существует также вопрос об отзыве URL, но я не совсем уверен в этом, так что если кто-то может помочь с этим в комментариях, это было бы здорово.
источник
Если вкладка открывается и закрывается без загрузки чего-либо, я попытался перейти с помощью ссылки «mock anchor», и это сработало.
источник