【问题标题】:Converting Image to base64 string in Typescript在 Typescript 中将图像转换为 base64 字符串
【发布时间】:2019-04-07 07:31:58
【问题描述】:

我正在尝试从 Angular 5 将 base64 字符串发布到我的 api

首先我必须将它从图像转换为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 中

但是在控制台中它给出错误“无法读取未定义的属性'结果'”

var binaryString = readerEvt.target.result;

如果有另一种更合适的方法代替此方法(任何 npm 包或其他东西,请告诉我),我如何将图像转换为 base64

提前致谢。

来自 MDN 的参考 MDN Link

【问题讨论】:

    标签: angular typescript angular5


    【解决方案1】:

    你需要使用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);
       };
    }
    

    【讨论】:

    • 我怎样才能将这个 base64 放入模型属性中,而不是 console.log
    • 您可以将base64内容分配给模型对象以进行API提交。更新了代码
    • 就是问题所在,模型对象在您建议的 reader.onload 函数中不可用
    • 经过一些更改后它起作用了 - "reader.result.toString().split(',')[1]" ,谢谢
    • 这里有一个问题,如果在浏览器中禁用 JavaScript 会起作用吗?
    【解决方案2】:

    这是我上传个人资料图片时所做的事情,我还检查了小于 512KB 的大小,然后我在下一个函数中将该图片发布到我的 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");
            }
        }   
    

    【讨论】:

    • 这是从哪里来的? "this.Image" 这个声明在哪里?
    • 将图片声明为图片:string = '';
    【解决方案3】:

    将图像读取为 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 install alife-file-to-base64 --save

    为您的项目添加依赖项

    将 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 : 设置组件变量的值

    【讨论】:

    • 试试这个来获取二进制文件
    • 检查这个答案
    • 我会尝试你的第二个选项,NPM 包也是
    猜你喜欢
    • 2018-09-07
    • 2014-07-21
    • 2013-07-04
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多