जावास्क्रिप्ट में फ़ाइल को बेस 64 में कैसे बदलें?


186

अब मुझे इस लाइन द्वारा फ़ाइल ऑब्जेक्ट मिल रहा है:

file = document.querySelector('#files > input[type="file"]').files[0]

मुझे इस फाइल को बेस 64 में json के माध्यम से भेजने की आवश्यकता है। मुझे इसे आधार 64 स्ट्रिंग में बदलने के लिए क्या करना चाहिए?

जवाबों:


118

आधुनिक ES6 रास्ता (async / प्रतीक्षा)

const toBase64 = file => new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => resolve(reader.result);
    reader.onerror = error => reject(error);
});

async function Main() {
   const file = document.querySelector('#myfile').files[0];
   console.log(await toBase64(file));
}

Main();

युपीडी:

यदि आप त्रुटियों को पकड़ना चाहते हैं

async function Main() {
   const file = document.querySelector('#myfile').files[0];
   const result = await toBase64(file).catch(e => Error(e));
   if(result instanceof Error) {
      console.log('Error: ', result.message);
      return;
   }
   //...
}

यह कोड गलत है। यदि आप awaitकोई ऐसा कार्य करते हैं, जो अस्वीकृत किए गए वादे को वापस करता है, तो आपको कॉल द्वारा लौटाया गया कोई त्रुटि नहीं मिलेगा; इसे फेंक दिया जाएगा और आपको इसे पकड़ने की आवश्यकता होगी।
दंक्रम्ब

1
एसिंक्स कार्यों और वादों के उपयोग का महान उदाहरण
थियागो फ्रास

292

FileReader कक्षा का उपयोग करके समाधान का प्रयास करें :

function getBase64(file) {
   var reader = new FileReader();
   reader.readAsDataURL(file);
   reader.onload = function () {
     console.log(reader.result);
   };
   reader.onerror = function (error) {
     console.log('Error: ', error);
   };
}

var file = document.querySelector('#files > input[type="file"]').files[0];
getBase64(file); // prints the base64 string

ध्यान दें कि .files[0]एक Fileप्रकार है, जो एक उपवर्ग है Blob। इस प्रकार इसका उपयोग किया जा सकता है FileReader
काम करने का पूरा उदाहरण देखें ।


2
FileReader API के बारे में अधिक पढ़ें: developer.mozilla.org/en-US/docs/Web/API/FileReader और ब्राउज़र सहायता: caniuse.com/#feat=filereader
Lukas Liesas

7
मैं का उपयोग करने की कोशिश की return reader.resultसे getBase64()(न कि का उपयोग करने से समारोह console.log(reader.result)) क्योंकि मैं एक चर के रूप में बेस 64 पर कब्जा (और फिर Google Apps स्क्रिप्ट के लिए भेज) करना चाहते हैं। मैंने फ़ंक्शन को इसके साथ बुलाया: var my_file_as_base64 = getBase64(file)और फिर कंसोल के साथ प्रिंट करने की कोशिश की console.log(my_file_as_base64 )और बस मिल गया undefined। मैं एक चर के लिए बेस 64 को कैसे ठीक से असाइन कर सकता हूं?
user1063287

1
मैंने उपरोक्त टिप्पणी से एक सवाल किया अगर कोई जवाब दे सकता है। stackoverflow.com/questions/47195119/…
user1063287

मुझे इस बेस 64 फ़ाइल को उसी फ़ाइल नाम के साथ ब्राउज़र में खोलने की आवश्यकता है, मैं इसे विंडो का उपयोग करके खोल रहा हूं। (url, '_blank') जो ठीक काम कर रहा है, मैं उसको फ़ाइल नाम कैसे दे सकता हूं? कृपया मदद कीजिए।
मुनीश शर्मा

धन्यवाद! मुझे लगता है कि इसे developer.mozilla.org/en-US/docs/Web/API/FileReader/…
johey

123

यदि आप एक वादा-आधारित समाधान के बाद हैं, तो यह @ दिमित्री का कोड इसके लिए अनुकूलित है:

function getBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => resolve(reader.result);
    reader.onerror = error => reject(error);
  });
}

var file = document.querySelector('#files > input[type="file"]').files[0];
getBase64(file).then(
  data => console.log(data)
);

मुझे इस बेस 64 फ़ाइल को उसी फ़ाइल नाम के साथ ब्राउज़र में खोलने की आवश्यकता है, मैं इसे विंडो का उपयोग करके खोल रहा हूं। (url, '_blank') जो ठीक काम कर रहा है, मैं उसको फ़ाइल नाम कैसे दे सकता हूं? कृपया मदद कीजिए।
मुनीश शर्मा

42

दिमित्री पाव्लुटिन और जोशुआ.पिंग के उत्तर पर निर्माण, यहां एक विस्तारित संस्करण है जो बेस 64 सामग्री को निकालता है (शुरुआत में मेटाडेटा को हटाता है) और यह भी सुनिश्चित करता है कि पैडिंग सही तरीके से की गई है

function getBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => {
      let encoded = reader.result.toString().replace(/^data:(.*,)?/, '');
      if ((encoded.length % 4) > 0) {
        encoded += '='.repeat(4 - (encoded.length % 4));
      }
      resolve(encoded);
    };
    reader.onerror = error => reject(error);
  });
}

2
Chrome 69, पहली जगह खाली फ़ाइल को पकड़ने के लिए है, दूसरा प्रतिस्थापित अल्पविराम है - एन्कोडेड = Reader.result.replace ("डेटा:", "") .replace (/ ^.*; base64, /, "");
user3333134

मेरा शब्द, मुझे वह कोमा वास्तव में याद आती है। यह अविश्वसनीय है कि यह मेरे बैकएंड को बिल्कुल परेशान नहीं करता है, मैं अभी भी एक्सेल फ़ाइलों को सफलतापूर्वक ओ_ओ अपलोड करने में सक्षम था। मैंने अपने खाली फ़ाइल उपयोग के मामले को भी ध्यान में रखते हुए regex को निर्धारित किया है। धन्यवाद।
अरनौद पी

2
मैं एक और भी आसान संस्करण मिल गया है: resolve(reader.result.replace(/^.*,/, ''));। चूँकि कोमा ,base64 वर्णमाला के बाहर है, इसलिए हम कोमा तक और इसमें शामिल होने वाली किसी भी चीज़ को छीन सकते हैं। stackoverflow.com/a/13195218/1935128
जॉनराइड

ठीक है, सिर के लिए धन्यवाद, हालांकि रेगेक्स के अनुसार मैंने यहां लिखा था (मुझे यकीन है कि फिर से प्रयोग करने की आवश्यकता होगी), वहाँ बस हो सकता है data:, बिना किसी अल्पविराम के, इसलिए मैं उस पहले भाग को उसी तरह रखूंगा। मैंने उसी हिसाब से जवाब अपडेट किया है।
अरनौद पी

1
@ArnaudP टाइपस्क्रिप्ट त्रुटि: संपत्ति 'बदलें' टाइप 'स्ट्रिंग' पर मौजूद नहीं है ArrayBuffer '।
रोमेल गोमेज़

12

जावास्क्रिप्ट बोटोआ () फ़ंक्शन का उपयोग डेटा को बेस 64 एनकोडेड स्ट्रिंग में बदलने के लिए किया जा सकता है


6
btoa केवल स्ट्रिंग के साथ काम करता है। फ़ाइल के साथ इसका उपयोग कैसे करें?
वासिली

10
आपको पहले फाइल को पढ़ना होगा और फिर इस फंक्शन में भेजना होगा .. कुछ इस तरह से jsfiddle.net/eliseosoto/JHQnk
प्रणव मनियर

1
@PranavManiar आपकी फीलिंग अब काम नहीं करती। क्या आप लिंक को अपडेट कर सकते हैं?
दान

5

यहाँ एक दो फ़ंक्शंस हैं, जिन्हें मैंने एक json फॉर्मेट में एक फाइल प्राप्त करने के लिए लिखा था, जिसे आसानी से पास किया जा सकता है:

    //takes an array of JavaScript File objects
    function getFiles(files) {
        return Promise.all(files.map(file => getFile(file)));
    }

    //take a single JavaScript File object
    function getFile(file) {
        var reader = new FileReader();
        return new Promise((resolve, reject) => {
            reader.onerror = () => { reader.abort(); reject(new Error("Error parsing file"));}
            reader.onload = function () {

                //This will result in an array that will be recognized by C#.NET WebApi as a byte[]
                let bytes = Array.from(new Uint8Array(this.result));

                //if you want the base64encoded file you would use the below line:
                let base64StringFile = btoa(bytes.map((item) => String.fromCharCode(item)).join(""));

                //Resolve the promise with your custom file structure
                resolve({ 
                    bytes: bytes,
                    base64StringFile: base64StringFile,
                    fileName: file.name, 
                    fileType: file.type
                });
            }
            reader.readAsArrayBuffer(file);
        });
    }

    //using the functions with your file:

    file = document.querySelector('#files > input[type="file"]').files[0]
    getFile(file).then((customJsonFile) => {
         //customJsonFile is your newly constructed file.
         console.log(customJsonFile);
    });

    //if you are in an environment where async/await is supported

    files = document.querySelector('#files > input[type="file"]').files
    let customJsonFiles = await getFiles(files);
    //customJsonFiles is an array of your custom files
    console.log(customJsonFiles);

1
एक सरणी में स्थित, सभी का वादा करें। बड़ा काम करता है! कम से कम मेरे लिए।
डेविडविलियन

0
onInputChange(evt) {
    var tgt = evt.target || window.event.srcElement,
    files = tgt.files;
    if (FileReader && files && files.length) {
        var fr = new FileReader();
        fr.onload = function () {
            var base64 = fr.result;
            debugger;
        }
        fr.readAsDataURL(files[0]);
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.