2017-02-27 17 views
5

角度2で画像をbase64に変換すると、画像はローカルからアップロードされます。現在、fileLoadedEvent.target.resultを使用しています。問題は、このbase64文字列をRESTサービスからjavaに送信すると、それをデコードできないことです。無料のオンラインエンコーダ/デコーダでこのbase64文字列を試してみると、デコードされた画像も見ることができません。キャンバスも使ってみました。適切な結果が得られない。一つは、base64の文字列が正しいものではないと確信しています。これにはパッケージを追加する必要がありますか?または、角度2では、画像をbase64にエンコードする方法はありますか?それは、角度1のangle-base64アップロードパッケージにあったのと同じです。角度2でbase64に画像を変換する

PLSのは、あなたがBASE64に画像をエンコードするためにbtoaやCrypto.jsを使用してみました、私のサンプルコード

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); 
    } 
} 
+1

はあなたのコードを表示し作成しました。 – Satpal

+1

入力ファイルコントロールからバックエンドに画像をアップロードする必要がありますか? – Habeeb

+0

ああ、私はそれがゾーンの問題だと思う... innerHtmlでのあなたの変更は、あなたが通常angular2で行う方法ではありません。 – laser

答えて

18

ワーキング下にplunkr Base64文字列

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)); 
    } 
+1

こんにちはParth Ghiya、それは私のために働いたよ:-)そんなにありがとう – lakshmi

+0

助けがあればupvoteと答えることができます:) –

+0

これは本当に有用。私は好奇心が強いです - 私は選択されたファイルを取って、それらをエンコードするためにそれらを反復している配列でこれを実装しています。エンコーダが動作している間に若干の遅延があるため、結果のファイルをthis.base64textStringに格納するとタイミングの問題が発生します。エンコーダにファイルリーダーの参照を取得させ、エンコードされたファイルをローカル変数に格納するのではなく、呼び出し元の関数に返すことは可能ですか? –

1

を見つけますか? 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);

+0

私もbtoaとcryptoで試しました。しかし、同じ文字列を与えていた。 – lakshmi

0

別の解決策は、私が

をした、base64のための作品は私の場合、このポスト https://stackoverflow.com/a/36281449/6420568

のようなものであるのthats

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; 
    } 
} 
関連する問題