Не удается загрузить ZIP-файл с сервера с помощью Angular - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь загрузить zip-файл с сервера, используя Angular.

Код колбы:

return send_file('<path>/filename.zip', attachment_filename='filename.zip', as_attachment=True)

Код Angular:

saveFile() {
const headers = new Headers();
headers.append('Accept', 'application/zip');
headers.append('Authorization', 'Token ' + <some token>);
headers.append('Access-Control-Allow-Origin', '*');
this.http.post('http://<server>:<port>/api/<urlpath>', {'somefield': 'somedata'}, { headers: headers, responseType: ResponseContentType.ArrayBuffer})
  .toPromise()
  .then(response => this.saveToFileSystem(response));
}

str2bytes(str: string) {
const bytes = new Uint8Array(str.length);
for (let i= 0; i< str.length; i++) {
  bytes[i] = str.charCodeAt(i);
}
return bytes;
}

private saveToFileSystem(response: any) {
const filename = 'file.zip';
const blob = new Blob([this.str2bytes(response._body)], {type: 'application/zip'});
saveAs(blob, filename);
}

При этомЯ могу скачать файл, но не могу его разархивировать.Ошибка:

Архив находится в неизвестном формате или поврежден

Я вижу, что есть различия в реализациях HTTP в Angular 5 и Angular 6. Исправьте меняесли я ошибаюсьЕсли да, я ищу решение с использованием Angular 6. Кроме того, я подумал, есть ли способ вернуть соединение (скажем, SFTP или что-то в этом роде) вместо самого файла и передать файл через соединение, а затем закрытьсвязь.Буду признателен за любую помощь.

ОБНОВЛЕНИЕ 1

Я нашел свою ошибку.Я должен использовать reponse._body как есть и не конвертировать его в байты.Итак, const blob = new Blob([this.str2bytes(response._body)], {type: 'application/zip'}); должно быть const blob = new Blob([response._body], { type: 'application/zip' });.Здесь не используется функция str2bytes.Но это работает нормально только в Angular 5, но не в Angular 6. Я столкнулся с другой ошибкой вместе с Angular 6. Я добавил catch к нему следующим образом, чтобы увидеть ошибку.

this.http.post('http://<server>:<port>/api/<urlpath>', {'somefield': 'somedata'}, { headers: headers, responseType: ResponseContentType.ArrayBuffer})
.toPromise()
.then(response => this.saveToFileSystem(response))
.catch( error => { 
     console.error(error);
      });

И ошибка:

{error: SyntaxError: Неожиданный токен P в JSON в позиции 0 в JSON.parse ()

Эта ошибка является для меня полной неожиданностью,Не в состоянии понять, где это пошло не так.Любая помощь приветствуется.

ОБНОВЛЕНИЕ 2

Пробная отладка.Я вижу это в ответе:

сообщение: «Неожиданный конец ввода»

Я подозреваю, что HTTP неверно, но не знаю, что именнобудет.

...