У меня проблемы с загрузкой файла .docx с сервера. Я могу корректно загружать и скачивать PDF-файлы или TXT-файлы, но не DOCX-файлы.
При загрузке я делаю это с помощью моего onNativeInputFileSelect
метода:
if(event.target.value){
const file: File = event.target.files[0];
let fileToUpload = new MyFile();
let filenames = file.name.split('.');
fileToUpload.name= filenames[0];
fileToUpload.type = filenames[1];
this.changeFile(file).then((base64: string):any => {
fileToUpload.content= base64;
this.networkService.uploadFileDocumento(fileToUpload).subscribe(() => {
...
, где changeFile
- это метод:
changeFile(file){
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
});
}
Когда я загружаю файл PDF, строка base64 начинается с
data:application/pdf;base64,JVBERi0xLjUKJb/3ov...
, а когда я загружаю файл docx, строка base64 начинается с
data:application/octet-stream;base64,UEsDBB...
Затем я попробуйте скачать файлы. Я могу правильно загрузить файл PDF, но когда я пытаюсь загрузить файл DOCX, я не получаю правильный тип файла (тип файла «Файл») и не могу открыть его как документ. Когда я получаю файл с сервера, я делаю это:
let splitted = file.content.split(',');
let type = splitted[0].substring(splitted[0].lastIndexOf(':') +1, splitted[0].lastIndexOf(';'));
let blob = this.b64toBlob(splitted[1], type);
let blobUrl = URL.createObjectURL(blob);
let doc = document.createElement("a");
doc.href = blobUrl;
doc.download = file.name;
doc.click();
Где b64toBlob - это следующий метод:
b64toBlob(b64Data, contentType = '', sliceSize = 512) {
const byteCharacters = atob(b64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
const blob = new Blob(byteArrays, { type: contentType });
return blob;
}
Почему я получаю application/octet-stream
при загрузке файла? И тогда я не могу скачать идентификатор с правильным типом? Куда я иду не так?