#angular #typescript #internet-explorer-11 #image-uploading
#angular #typescript #internet-explorer-11 #загрузка изображения
Вопрос:
Я пытаюсь загрузить изображение в свое веб-приложение в 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 amp;amp; 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:
Вы можете проверить эту проблему и попробовать использовать следующий код:
fileChange = function (evt) {
let files = evt.target.files;
let file = files[0];
if (files amp;amp; file) {
const reader = new FileReader();
reader.onload = (event: Event) => {
// event.target.resu< // This is invalid
console.log(reader.result); // This is valid
};
reader.readAsBinaryString(file);
}
};