Angular2 пустое тело ответа docx пусто
Я использую Angular2 для загрузки сгенерированного файла.docx с моего экспресс-сервера. Файл генерируется инструментом и сохраняется на сервере, а затем отправляется на веб-интерфейс.
В журнале моего браузера указано, что длина результата больше 0, но отправляемый BLOB-объект не имеет тела, поэтому фактическое содержимое документа не может быть найдено.
Я следовал нескольким примерам и учебникам, особенно этому, но пока никакого результата. Что я делаю неправильно?
экспресс-бэкэнд:
generate(req: express.Request, res: express.Response): void {
try {
var docxGenerator = new DocxGenerator();
docxGenerator.generate((error, filename) => {
if (error) res.send(error);
if (filename) {
res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');
res.setHeader('Content-disposition', 'attachment; filename=GeneratedFile.docx');
var file = fs.readFileSync(filename);
res.end(file);
}
});
} catch (error) {
res.send(error);
}
}
Angular2 Сервис:
export class DocxTemplaterService {
// declarations left out for brevity
constructor(
private http: Http,
private authService: AuthenticationService
) {
this.headers = new Headers({'Content-Type': 'application/json'});
this.headers.append('Authorization', 'Bearer ' + this.authService.token());
this.options = new RequestOptions({ headers: this.headers });
}
generateDocx(): Observable<any> {
this.options.responseType = ResponseContentType.Blob;
return this.http
.post(this.docxUtilUrl + '/create', JSON.stringify(module), this.options)
.map(response => {
console.dir(response);
response.blob();
})
.catch(this.handleError);
}
private handleError(error: any) {
return Promise.reject(error.message || error);
}
}
Angular2 Компонент:
generateDocx(module: Module) {
this.docxTemplateService
.generateDocx()
.subscribe(
data => {
console.log(`Word data: ${data}`);
if (data !== undefined)
// save file somehow
else console.log('No file to download.');
},
error => { this.alertService.error(error); },
() => this.alertService.success("Success", true)
);
}
Содержимое Blob зарегистрировано в консоли Chrome:
size: 68192
type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
__proto__: Blob
Итак... размер без содержимого. Помощь приветствуется!
1 ответ
Вы должны явно вернуть response.blob
от function
как вы использовали скобки в функции стрелки.
generateDocx(): Observable<any> {
this.options.responseType = ResponseContentType.Blob;
return this.http
.post(this.docxUtilUrl + '/create', JSON.stringify(module), this.options)
.map(response => {
console.dir(response);
return response.blob(); //need to return response blob
})
.catch(this.handleError);
}
Или, скорее, вы можете сделать это map
функция одного лайнера
.map(response => response.blob())
Подобный ответ здесь