Не удается проверить все файлы, которые я загружаю - PullRequest
0 голосов
/ 18 декабря 2018

хорошо, я учусь создавать приложение со средним стеком и пытаюсь создать приложение типа электронной коммерции.Моя проблема связана с загрузкой изображений.

Я пытаюсь загрузить несколько файлов одновременно, но всегда получаю сообщение об ошибке, полученное в результате проверки типа MIME.

mime.type.validation.ts:

import { AbstractControl } from '@angular/forms';
import { Observable, Observer, of } from 'rxjs';

export const mimeType = (

  control: AbstractControl
): Promise<{ [key: string]: any }> | Observable<{ [key: string]: any }> => {
  if (typeof(control.value) === 'string') {
    return of(null);
  }
  const file = control.value as File;
  const fileReader = new FileReader();
  const frObs = Observable.create(
    (observer: Observer<{ [key: string]: any }>) => {
      fileReader.addEventListener('loadend', () => {
       let result1: any;
       let finalResult: any;
       result1 = fileReader.result;
       finalResult = result1 as ArrayBuffer;

        const arr = new Uint8Array(finalResult).subarray(0, 4);
        let header = '';
        let isValid = false;
        for (let i = 0; i < arr.length; i++) {
          header += arr[i].toString(16);
        }
        switch (header) {
          case '89504e47':
            isValid = true;
            break;
          case 'ffd8ffe0':
          case 'ffd8ffe1':
          case 'ffd8ffe2':
          case 'ffd8ffe3':
          case 'ffd8ffe8':
            isValid = true;
            break;
          default:
            isValid = false; // Or you can use the blob.type as fallback
            break;
        }
        if (isValid) {
          observer.next(null);
        } else {
          observer.next({ invalidMimeType: true });
        }
        observer.complete();
      });
      fileReader.readAsArrayBuffer(file);
    }
  );

  return frObs;
};

post-create.ts

onImagePick(event) {
let file =(event.target as HTMLInputElement).files;
 let fileArray = Array.from(file);

 if(file === undefined){return;}
  this.form.patchValue({'image' : file});
  this.form.get('image').updateValueAndValidity();    
  for(let fil of fileArray) {
  let reader = new FileReader();
  reader.onload = () => {   
  this.imagePreview.push(reader.result);
  };
  reader.readAsDataURL(fil);    
  }      
}

Ошибка, которую он дает:

ОШИБКАTypeError: Не удалось выполнить «readAsArrayBuffer» для «FileReader»: параметр 1 не относится к типу «Blob».

Я считаю, что элемент управления mimetype действует до того, как я преобразую FileList в один файл.Поэтому всякий раз, когда он достигает readAsArrayBuffer, он передает аргумент FileList вместо файла.Но я не могу найти, как решить проблему.

1 Ответ

0 голосов
/ 19 декабря 2018

Это действительно был список файлов!Поэтому я положил его внутрь для, и он остановил ошибку.

 onImagePick(event) {
 let file =(event.target as HTMLInputElement).files;
 let fileArray = Array.from(file);

 if(file === undefined){return;}
  for(let fil of fileArray) {
  this.form.patchValue({'image' : fil});
  this.form.get('image').updateValueAndValidity();    
  let reader = new FileReader();
  reader.onload = () => {   
  this.imagePreview.push(reader.result);
  };
  reader.readAsDataURL(fil);    
  }      
}
...