Подтвердить что ты не робот

Загрузка xlsx файла в angular 2 с помощью blob

Я хочу загрузить файл xlsx с клиента на angular 2, используя rest api.

Я получаю байтовый массив как ответ от моего запроса GET, и я отправляю его для загрузки с подпиской:

let options = new RequestOptions({ search: params });
this.http.get(this.restUrl, options)
          .subscribe(this.download); 

функция загрузки с помощью blob:

download(res: Response) {
let data = new Blob([res.arrayBuffer()], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;' });
FileSaver.saveAs(data, this.fileName);};

моя проблема в том, что мой файл постоянно поврежден. Я пробовал много версий этого, но ничего не работает.

** также попробовал его с этим решением, и он не работает (файл xlsx по-прежнему поврежден) - Angular 2 загрузка файла: поврежденный результат, разница в том, что мои данные являются буфером массива, а не строкой или json, и существует разница между PDF и xlsx.

10x!

4b9b3361

Ответ 1

После того, как ничего не работает. Я изменил свой сервер, чтобы вернуть тот же массив байтов с добавлением:

    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setHeader("Content-Disposition", "attachment; filename=deployment-definitions.xlsx");

На моем клиенте я удалил функцию загрузки, а вместо части GET я сделал:

window.open(this.restUrl, "_blank");

Это единственный способ найти файл xlsx, который не поврежден.

Если у вас есть ответ о том, как это сделать с помощью blob, скажите мне:)

Ответ 2

У меня была такая же проблема, как у вас - исправил ее, добавив responseType: ResponseContentType.Blob к моим параметрам Get. Проверьте код ниже:

public getReport(filters: ReportOptions) {
    return this.http.get(this.url, {
            headers: this.headers,
            params: filters,
            responseType: ResponseContentType.Blob
        })
        .toPromise()
        .then(response => this.saveAsBlob(response))
        .catch(error => this.handleError(error));
}

SaveAsBlob() - это просто оболочка для FileSaver.SaveAs():

private saveAsBlob(data: any) {
    const blob = new Blob([data._body],
        { type: 'application/vnd.ms-excel' });
    const file = new File([blob], 'report.xlsx',
        { type: 'application/vnd.ms-excel' });

    FileSaver.saveAs(file);
}

Ответ 3

вы можете использовать приведенный ниже код:

var file = new Blob([data], { 
    type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
});
saveAs(file,"nameFile"+".xlsx");
deferred.resolve(data);

Ответ 4

Следующее решение работало для меня в Google Chrome версии 58.0.3029.110 (64-разрядная версия).

Это статья, объясняющая, как загрузить pdf с помощью Blob: https://brmorris.blogspot.ie/2017/02/download-pdf-in-angular-2.html

Это тот же принцип для файла xlsx. Просто выполните шаги из статьи и измените две вещи:

  • Вместо {'Accept': 'application/pdf'} используйте {'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'};
  • Blob, используйте тот же тип для создания вашего Blob, нового Blob ([fileBlob], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}).

В статье используется File Saver, но я этого не сделал. Я оставил комментарий в статье с основным объяснением того, что я использовал вместо File Saver.

Ответ 5

Вот решение, поддерживающее браузеры IE и Chrome/Safari. Здесь объектом "ответ" является ответ, полученный от службы. У меня это работает для архива. Вы можете изменить тип в соответствии с ответом, полученным от службы.

    let blob = new Blob([response], {type: 'application/zip'});
    let fileUrl = window.URL.createObjectURL(blob);
    if (window.navigator.msSaveOrOpenBlob) {
        window.navigator.msSaveOrOpenBlob(blob, fileUrl.split(':')[1] + '.zip');
    } else {
        this.reportDownloadName = fileUrl;
        window.open(fileUrl);
    }

Ответ 6

Для меня проблема заключалась в том, что мой responseType был "текстовым". Вместо этого мне нужно было использовать "blob"; У меня работает на Angular 7.2.15.