Angular4 загрузка изображения в машинописи на ie11 - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь загрузить изображение в свое веб-приложение в Angular 4 . Я преобразовываю входной файл с помощью readAsBinaryString () и извлекаю код ascii с помощью btoa () , который затем передаю бэкэнд-службе. Все работает правильно в Chrome, но не в Internet Explorer 11.

Чтобы исправить на ie11, я добавил функцию readAsBinaryString () в polyfills.ts :

function str2ab(str) {
  let buf = new ArrayBuffer(str.length);
  let bufView = new Uint8Array(buf);
  for (let i = 0, strLen = str.length; i < strLen; i++) {
    bufView[i] = str.charCodeAt(i);
  }
  return buf;
}

if (!FileReader.prototype.readAsBinaryString) {
  FileReader.prototype.readAsBinaryString = function (fileData) {
    let binary = '';
    let pt = this;
    let reader = new FileReader();
    reader.onload = function (e) {
      let bytes = str2ab(reader.result);
      let length = bytes.byteLength;
      for (let i = 0; i < length; i++) {
        binary += String.fromCharCode(bytes[i]);
      }
      pt.content = binary;
      pt.onload();
    };
    reader.readAsArrayBuffer(fileData);
  };
}

image.component.html

<input type="file" name="image" id="image" accept="image/png, image/jpeg" (change)="fileChange($event)" [(ngModel)]="image" placeholder="Upload image">

image.component.ts

  fileChange = function (evt) {
    let files = evt.target.files;
    let file = files[0];
    if (files && file) {
      let reader = new FileReader();
      reader.onload = (e) => { // 'e' is undefined on ie11!
        let target = <FileReader>e.target;
        let result = target.result as string;
        this.byteArray = btoa(result);
      };
      reader.readAsBinaryString(file);
    }
  };

В настоящее время с полизаполнениями работает функция readAsBinaryString () на ie11, но в функции reader.onload выдает следующую ошибку: Невозможно получить свойство 'target' с неопределенной или нулевой ссылкой .

1 Ответ

0 голосов
/ 28 марта 2019

Вы можете проверить эту проблему и попробовать использовать следующий код:

  fileChange = function (evt) {
    let files = evt.target.files;
    let file = files[0];
    if (files && file) {
      const reader = new FileReader();

      reader.onload = (event: Event) => {
        // event.target.result; // This is invalid
        console.log(reader.result); // This is valid
     };

      reader.readAsBinaryString(file);
    }
  };
...