Angular 8 не может загрузить файл docx из строки base 64 - PullRequest
0 голосов
/ 10 апреля 2020

У меня проблемы с загрузкой файла .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 при загрузке файла? И тогда я не могу скачать идентификатор с правильным типом? Куда я иду не так?

...