Görüntü Base64'e dönüştür


84
<input type="file" id="asd"/>

Kullanıcı bunu seçtikten sonra görseli base64'te almak istiyorum (formu göndermeden önce)

Gibi bir şey :

$(input).on('change',function(){
  var data = $(this).val().base64file(); // it is not a plugin is just an example
  alert(data);
});

Dosya API'si ve diğer şeyler hakkında okudum, basit ve tarayıcılar arası bir çözüm istiyorum (açıkça IE6 / IE7 hariç)

Herhangi bir yardım için teşekkür ederiz.


1
Ve HTML5 Dosyası api'si hakkında neyi anlamadınız? Ne denedin Ne işe yaramadı?
epascarello

@epascarello aslında tam olarak desteklenmiyorlar caniuse.com/#feat=fileapi Bir işe ihtiyacım var, özellikle android sürümleri (eski sürümler) ve eski iOS sürümleri için hala kullanıldığından ve ayrıca IE9'u da dahil etmek istiyorum. hala çok kullanılıyor: P
bombastic

ne için bir geçici çözüm? Dosyayla ne yapmaya çalışıyorsun? base64file()- bu bir eklenti mi?
David Hellsing

@David, kullanıcı bilgisayarından dosyayı seçtikten sonra base64 dosyasını almak istiyorum, base64file () sadece bir örnek
bombastic

1
@epascarello evet ve bu tam olarak benim sorumdu, tüm tarayıcıları nasıl destekleyebilirim: D
bombastic

Yanıtlar:


212

function readFile() {
  
  if (this.files && this.files[0]) {
    
    var FR= new FileReader();
    
    FR.addEventListener("load", function(e) {
      document.getElementById("img").src       = e.target.result;
      document.getElementById("b64").innerHTML = e.target.result;
    }); 
    
    FR.readAsDataURL( this.files[0] );
  }
  
}

document.getElementById("inp").addEventListener("change", readFile);
<input id="inp" type='file'>
<p id="b64"></p>
<img id="img" height="150">

( Not: Base64 kodlu bir görüntü (Dize) 4/3 orijinal görüntü verisinin boyutunda)

Birden fazla resim yüklemek için bu yanıtı kontrol edin .

Tarayıcı desteği: http://caniuse.com/#search=file%20api
Daha fazla bilgi burada: https://developer.mozilla.org/en-US/docs/Web/API/FileReader


2
evet teşekkür ederim, bu yüzden aslında Dosya okuyucunun tam olarak desteklenmediğini görebiliyorum, aynı desteği eski android / iOS cihazları da nasıl yapabilirim?
Temmuz'13'te

1
başka tarayıcı var mı? xD
RicardoE

Bu, görüntüyü base64 dönüştürmesi için gerçekten düzgün bir koddu .. Bunu javascript'te görüntüye dönüştürebilir miyim? Daha önce base64 kod çözme kullandım, ancak görüntü dönüşümleri hakkında hiçbir fikrim yok ..
The Coder

@TheCoder Bunu doğrudan img src'ye base64 dizesi olarak koyabilirsiniz, ondan görüntü verilerini almak için tuval bağlamını kullanın.
Qwerty

1
@bombastic Hem iOS hem de android uygulaması oluşturmak için JS'yi kullandım, her iki platformda da iyi çalıştı. İOS normal ve android üzerinde galeri izni almak için bazı yerel koda ihtiyacım vardı ...
Osman Gani Khan Masum

35

Tam olarak ihtiyacınız olan şey :) Geri arama sürümünü veya Promise sürümünü seçebilirsiniz. Sözlerin IE'de yalnızca Promise polyfill lib ile çalışacağını unutmayın. Bu kodu bir sayfaya bir kez koyabilirsiniz ve bu işlev tüm dosyalarınızda görünecektir.

Loadend olayı, bir kaynağın yüklenmesinde ilerleme durduğunda tetiklenir (ör. "Hata", "iptal" veya "yük" gönderildikten sonra)

Geri arama sürümü

        File.prototype.convertToBase64 = function(callback){
                var reader = new FileReader();
                reader.onloadend = function (e) {
                    callback(e.target.result, e.target.error);
                };   
                reader.readAsDataURL(this);
        };

        $("#asd").on('change',function(){
          var selectedFile = this.files[0];
          selectedFile.convertToBase64(function(base64){
               alert(base64);
          }) 
        });

Promise versiyonu

    File.prototype.convertToBase64 = function(){
         return new Promise(function(resolve, reject) {
                var reader = new FileReader();
                reader.onloadend = function (e) {
                    resolve({
                      fileName: this.name,
                      result: e.target.result, 
                      error: e.target.error
                    });
                };   
                reader.readAsDataURL(this);
        }.bind(this)); 
    };

    FileList.prototype.convertAllToBase64 = function(regexp){
      // empty regexp if not set
      regexp = regexp || /.*/;
      //making array from FileList
      var filesArray = Array.prototype.slice.call(this);
      var base64PromisesArray = filesArray.
           filter(function(file){
             return (regexp).test(file.name)
           }).map(function(file){
             return file.convertToBase64();
           });
      return Promise.all(base64PromisesArray);
    };

    $("#asd").on('change',function(){
      //for one file
      var selectedFile = this.files[0];
      selectedFile.convertToBase64().
          then(function(obj){
            alert(obj.result);
          });
      });
      //for all files that have file extention png, jpeg, jpg, gif
      this.files.convertAllToBase64(/\.(png|jpeg|jpg|gif)$/i).then(function(objArray){
            objArray.forEach(function(obj, i){
                  console.log("result[" + obj.fileName + "][" + i + "] = " + obj.result);
            });
      });
    })

html

<input type="file" id="asd" multiple/>

8
<input type="file" onchange="getBaseUrl()">
function getBaseUrl ()  {
    var file = document.querySelector('input[type=file]')['files'][0];
    var reader = new FileReader();
    var baseString;
    reader.onloadend = function () {
        baseString = reader.result;
        console.log(baseString); 
    };
    reader.readAsDataURL(file);
}

1
'dosya' bildirilir ancak değeri hiçbir zaman getBaseUrl () işlevi içinde okunmaz.
Biranchi

@Biranchi fileson satırda kullanıldıreader.readAsDataURL(file);
Achim

7

Bu durumda Ertelenmiş Nesne ile çalışmak ve geri dönüş vaadi:

function readImage(inputElement) {
    var deferred = $.Deferred();

    var files = inputElement.get(0).files;
    if (files && files[0]) {
        var fr= new FileReader();
        fr.onload = function(e) {
            deferred.resolve(e.target.result);
        };
        fr.readAsDataURL( files[0] );
    } else {
        deferred.resolve(undefined);
    }

    return deferred.promise();
}

Ve yukarıdaki işlev şu şekilde kullanılabilir:

var inputElement = $("input[name=file]");
readImage(inputElement).done(function(base64Data){
    alert(base64Data);
});

Veya sizin durumunuzda:

$(input).on('change',function(){
  readImage($(this)).done(function(base64Data){ alert(base64Data); });
});

buna gerçekten ihtiyacım vardı, base64'ü arama yöntemine döndürdüğüm için ertelenmiş demek istiyorum. Çözümünüzün tüm tarayıcılarda çalışıp çalışmayacağını bilmek istiyorum.
Thameem

0

// https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL

/* Simple */
function previewImage( image, preview, string )
{

    var preview     = document.querySelector( preview );
    var fileImage   = image.files[0];

    var reader      = new FileReader();

    reader.addEventListener( "load", function() {

        preview.style.height    = "100";
        preview.title           = fileImage.name;

        // convert image file to base64 string
        preview.src             = reader.result;

        /* --- */

        document.querySelector( string ).value = reader.result;                    

    }, false );

    if ( fileImage )
    {
        reader.readAsDataURL( fileImage );
    }

}

document.querySelector( "#imageID" ).addEventListener( "change", function() {

    previewImage( this, "#imagePreviewID", "#imageStringID" );

} )
/* Simple || */
<form>

    File Upload: <input type="file" id="imageID" /><br />
    Preview: <img src="#" id="imagePreviewID" /><br />    
    String base64: <textarea id="imageStringID" rows="10" cols="50"></textarea>

</form>

kod kutusu

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.