【问题标题】:Converting an image to base64 in angular 2以角度2将图像转换为base64
【发布时间】:2020-07-18 05:06:27
【问题描述】:

将图片转换为角度2中的base64,图片是从本地上传的。当前正在使用 fileLoadedEvent.target.result。问题是,当我通过 REST 服务将此 base64 字符串发送到 java 时,它无法对其进行解码。当我用免费的在线编码器-解码器尝试这个 base64 字符串时,我也看不到解码后的图像。我也尝试使用画布。我没有得到正确的结果。一件事是肯定得到的base64字符串不是正确的,我需要为此添加任何包吗?或者在 angular 2 中,是否有任何特殊的方法可以将图像编码为 base64,就像在 angular 1 - angular-base64-upload 包中一样。

请在下面找到我的示例代码

onFileChangeEncodeImageFileAsURL(event:any,imgLogoUpload:any,imageForLogo:any,imageDiv:any)
{
    var filesSelected = imgLogoUpload.files;
    var self = this;
    if (filesSelected.length > 0) {
      var fileToLoad = filesSelected[0]; 

      //Reading Image file, encode and display
       var  reader: FileReader = new FileReader();
       reader.onloadend = function(fileLoadedEvent:any) {

       //SECOND METHO
       var imgSrcData = fileLoadedEvent.target.result; // <--- data: base64 

        var newImage = imageForLogo;
        newImage.src = imgSrcData;
        imageDiv.innerHTML = newImage.outerHTML;

      }
      reader.readAsDataURL(fileToLoad);
    }
}

【问题讨论】:

  • 需要从输入文件控件上传图片到后端吗?
  • 啊,好吧,我想这是区域问题...您对 innerHtml 的更改与您通常对 angular2 所做的不同。
  • 尝试在这个问题中做同样的事情:stackoverflow.com/questions/42482528/… 当你有一个回调 onloadend... 让它在区域内,然后 angular2 会知道应该更新视图

标签: javascript java jquery angular typescript


【解决方案1】:

base64 字符串的工作 plunkr

https://plnkr.co/edit/PFfebmnqH0eQR9I92v0G?p=preview

  handleFileSelect(evt){
      var files = evt.target.files;
      var file = files[0];

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

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

        reader.readAsBinaryString(file);
    }
  }



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

【讨论】:

  • 这真的很有用。我很好奇 - 我正在一个数组中实现它,该数组获取选定的文件并迭代它们以对其进行编码。因为编码器工作时有轻微的延迟,所以将生成的文件存储在 this.base64textString 中会导致时间问题。是否可以让编码器获取文件读取器引用并将编码文件返回给调用函数,而不是将其存储在局部变量中?
  • 为我工作。谢谢。您知道如何在将图像发送到服务器之前减小它们的大小吗?
  • 这对我也很有效。非常感谢
【解决方案2】:

我稍微修改了 Parth Ghiya 的回答,所以你可以上传 1- 多张图片,它们都以 base64 编码字符串的形式存储在一个数组中

base64textString = [];

onUploadChange(evt: any) {
  const file = evt.target.files[0];

  if (file) {
    const reader = new FileReader();

    reader.onload = this.handleReaderLoaded.bind(this);
    reader.readAsBinaryString(file);
  }
}

handleReaderLoaded(e) {
  this.base64textString.push('data:image/png;base64,' + btoa(e.target.result));
}

HTML 文件

<input type="file" (change)="onUploadChange($event)" accept=".png, .jpg, .jpeg, .pdf" />
<img *ngFor="let item of base64textString"  src={{item}} alt="" id="img">

【讨论】:

    【解决方案3】:

    另一个适用于 base64 的解决方案类似于这篇文章 https://stackoverflow.com/a/36281449/6420568

    在我的情况下,我做到了

    getImagem(readerEvt, midia){
        //console.log('change no input file', readerEvt);
        let file = readerEvt.target.files[0];
        var reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = function () {
            //console.log('base64 do arquivo',reader.result);
            midia.binario = btoa(reader.result);
            //console.log('base64 do arquivo codificado',midia.binario);
        };
        reader.onerror = function (error) {
            console.log('Erro ao ler a imagem : ', error);
        };
    }
    

    和html组件

    <input type="file" class="form-control"  (change)="getImagem($event, imagem)">
    
    <img class="img-responsive"  src="{{imagem.binario | decode64 }}" alt="imagem..." style="width: 200px;"/>
    

    为了显示图像,我创建了管道 decode64

    @Pipe({
      name: 'decode64'
    })
    export class Decode64Pipe implements PipeTransform {
      transform(value: any, args?: any): any {
        let a = '';
        if(value){
           a = atob(value);
        }
        return a;
      }
    }
    

    【讨论】:

      【解决方案4】:

      您是否尝试过使用 btoa 或 Crypto.js 将图像编码为 base64 ?

      链接到cryptojs - https://code.google.com/archive/p/crypto-js/

      var imgSrcData = window.btoa(fileLoadedEvent.target.result);

      var imgSrcData = CryptoJS.enc.Base64.stringify(fileLoadedEvent.target.result);

      【讨论】:

      • 我也尝试了 btoa 和 crypto。但它给出的字符串相同。
      【解决方案5】:

      这是来自 Parth Ghiya 的相同代码,但以 ES6/TypeScript 格式编写

      picture: string;
      handleFileSelect(evt){
          const file = evt.target.files[0];
          if (!file) {
              return false;
          }
          const reader = new FileReader();
          
          reader.onload = () => {
              this.picture = reader.result as string;
          };
      
          console.log(btoa(this.picture));
      }
      

      【讨论】:

        【解决方案6】:

        我想出了一个答案,用 json 调用 post 方法的 HTTP 请求

        1.event 参数来自 HTML 输入标记。
        2. self.imagesrc 是一个组件变量,用于存储数据并在头文件中使用它,我们需要将“this”转换为一个self变量并在阅读器中使用它。加载功能
        3.this.server是我在这个组件中使用的API调用服务组件变量

        UploadImages(event) {
            var file = event.target.files[0];
            var reader = new FileReader();
            reader.readAsDataURL(file);
            var self = this;
            reader.onload = function() {
              self.imageSrc = reader.result.toString();
            };
        
            var image_data = {
              authentication_token: this.UD.getAuth_key ,
              fileToUpload: this.imageSrc,
              attachable_type: "Photo"
            };
        
            this.server.photo_Upload(image_data).subscribe(response => {
              if (response["success"]) {
                console.log(response);
              } else {
                console.log(response);
              }
            });
          }
        

        【讨论】:

          【解决方案7】:

          请考虑使用这个包:image-to-base64

          生成一个base64的图片,你可以使用路径或者url来实现。

          Or this accepted answer

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-09-29
            • 2020-10-13
            • 1970-01-01
            • 2018-11-02
            • 2015-12-09
            • 2020-06-23
            • 2014-04-06
            • 2017-09-12
            相关资源
            最近更新 更多