Я пытаюсь загрузить 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
неверно, но не знаю, что именнобудет.