Преобразование изображения в строку base64 в Typescript - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь опубликовать строку base64 для моего API из Angular 5

Сначала я должен преобразовать его в base64 из изображения. После проверки в Интернете и MDN я разработал метод

  OnIDChange(event) {
    var file = event.target.files[0];
    var reader = new FileReader();
    reader.onloadend = this.handleReaderLoaded.bind(this, "Id");
    reader.readAsBinaryString(file);
  }

А

    handleReaderLoaded(readerEvt:any, indicator: string) {
     var binaryString = readerEvt.target.result;
     if (indicator == "Id") {
       this.Model.IDPhoto = btoa(binaryString);
     }
  }

Я должен сохранить этот base64 в свойстве модели, чтобы опубликовать его в API

Но в консоли выдается ошибка "Не удается прочитать свойство 'result' undefined" на

var binaryString = readerEvt.target.result;

Как я могу преобразовать изображение в base64, если вместо этого есть другой более подходящий способ (любой пакет npm или что-то еще, дайте мне знать это тоже)

Заранее спасибо.

Справка из MDN MDN Link

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

Считать изображение как base64:

  selectFile(event){
      var files = event.target.files;
      var file = files[0];

    if (files && file) {
        var reader = new FileReader();

        reader.onload =this.handleFile.bind(this);

        reader.readAsBinaryString(file);
    }
  }



  handleFile(event) {
     var binaryString = event.target.result;
            this.base64textString= btoa(binaryString);
            console.log(btoa(binaryString));
    }


***********************************************************************************

ИЛИ

Пакет NPM для альтернативного использования:

https://www.npmjs.com/package/alife-file-to-base64

установить: npm установить alife-файл в base64 --save

Добавить Dependecy в ваш проект

Импорт AlifeFileToBase64Module в ваш проект и включение модуля в раздел импорта

import { AlifeFileToBase64Module } from 'alife-file-to-base64';

@NgModule({
  declarations: [
  ],
  imports: [
    AlifeFileToBase64Module
  ],
  providers: [],
  bootstrap: [AppComponent]
})

Синтаксис для использования в любом месте вашего проекта:

<input type="file" alife-file-to-base64 (onFileChanged)="onFileChanges($event)" [(fileModel)]="files" />
  • onFileChanged : Будет вызван, когда файл будет выбран пользователем. Это будет содержать имя файла, размер файла, тип и base64.
  • fileModel : установить значение переменной компонента
0 голосов
/ 03 ноября 2018

Это то, что я сделал, чтобы загрузить изображение профиля, которое я также проверил на размер менее 512 КБ, а затем я разместил это изображение в своем API в следующей функции

Я использовал FileReader () и readAsDataURL () для преобразования файла в base64

/* On Change Profile image*/    
    onProfileChange(event:any) {
        if(event.target.files && event.target.files[0]) {
            if(event.target.files[0].type && event.target.files[0].type.split('/')[0] == ["image"] && event.target.files[0].size <= 512000){
                this.file = event.target.files[0];
                var reader = new FileReader();
                reader.onload = (event:any) => {
                    this.Image = event.target.result;
                }
                reader.readAsDataURL(event.target.files[0]);
                this.isBrowser = false;
            } else {
                this.isBrowser = true;
                this._toastr.error("Max image upload size is 500KB only");
            }
        }
    }
    /*end Of On Change profile Image*/


    /*Image api*/
    AddImage(event: any){
        let data=new FormData();
        if(this.file){
            data.append('image',this.file);
            this._db.Post('api/users/image',data).subscribe(b=>{
                if(b.IsResult){
                    this._toastr.success(b.ResultMsg);
                    this.getProfileDetail();
                    this.isBrowser=true;
                }
            });
        }else{
            this._toastr.error("Something went wrong");
        }
    }   
0 голосов
/ 03 ноября 2018

Вам нужно использовать readAsDataUrl():

function getBase64(event) {
   let me = this;
   let file = event.target.files[0];
   let reader = new FileReader();
   reader.readAsDataURL(file);
   reader.onload = function () {
     //me.modelvalue = reader.result;
     console.log(reader.result);
   };
   reader.onerror = function (error) {
     console.log('Error: ', error);
   };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...