Как я могу создать сервис загрузки файлов на Angular? - PullRequest
0 голосов
/ 30 января 2019

Я создаю контроллер в своем .Net Core API для создания файла с слепком пакета iTextSharp и отправляю файл pdf пользователю.Когда я тестирую его с помощью Swagger, потому что он реализован в проекте, он работает хорошо, но не работает, когда я хочу использовать контроллер в своем угловом приложении.

Мой контроллер C #:

[HttpPost("[Action]")]
public IActionResult CreateLicensePDF(License license) { 
    GenerateLicenseFIleService generateLicenseFIleService = new GenerateLicenseFIleService();
    byte[] abytes = generateLicenseFIleService.Generate(license);
    string fileName = license.Customer.CustomerNumber + "-" + license.Order.OrderNumber + ".pdf";
    return File(abytes, "application/pdf", fileName);
}

Служба, которая вызывает API-адрес для выполнения контроллера в моем угловом приложении:

generateLicensePDF(license){
    return this.http.post(`${this.config.catchApiUrl()}GenerateFile/CreateLicensePDF`,license);

}

При нажатии кнопки она выполняет эту функцию, чтобы вызвать службу

onSubmit(){
    // get a license by id and it's return license's data
    this.licenseInfoService.getLicenseById(1).subscribe(

    r => {// call the service which download the file
        this.licenseInfoService.generateLicensePDF(r).subscribe(

            r => console.log("yeah"),
            err => console.log(err))

   }

}

Iпопробуйте многое, но ошибка всегда:

возвращается HttpErrorMessage, статус 400 с этим сообщением об ошибке

"": ["Ввод был недействительным.

или:

возвращается HttpErrorMessage, состояние равно 200 с этим сообщением об ошибке

SyntaxError: неожиданный токен% в JSON в позиции 0 в JSON.parse () в XMLHttpRequest.onLoad

1 Ответ

0 голосов
/ 30 января 2019

Как насчет настройки responseType :

generateLicensePDF(license){
    return this.http.post(`${this.config.catchApiUrl()}GenerateFile/CreateLicensePDF`,license, { responseType: 'blob' });
}

Затем вы можете установить Angular FileSaver :

npm install file-saver --save

И затем:

import { saveAs } from 'file-saver';

onSubmit(){
    // get a license by id and it's return license's data
    this.licenseInfoService.getLicenseById(1).subscribe(

    r => {// call the service which download the file
        this.licenseInfoService.generateLicensePDF(r).subscribe(
            x => {
                saveAs(x);
                console.log("yeah")
            },
            err => console.log(err))
   }
}

И вы получите Blob результат от обслуживания, и с помощью saveAs вы загрузите его на свой компьютер.Если вы хотите получить ответ с файлом, вы можете использовать:

this.http.post(`${this.config.catchApiUrl()}GenerateFile/CreateLicensePDF`,license, { observe: 'response', responseType: 'blob' });

, а затем вы можете сохранить файл с помощью:

saveAs(r.body)

Надеюсь, это поможет ...

...