কীভাবে জাভাস্ক্রিপ্টে ফাইলটি বেস64 এ রূপান্তর করবেন?


186

এখন আমি এই লাইন দ্বারা ফাইল অবজেক্ট পাচ্ছি:

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

আমাকে এই ফাইলটি বেস 64 তে জসনের মাধ্যমে প্রেরণ করা দরকার need এটি বেস 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();

UPD:

আপনি যদি ত্রুটি ধরতে চান

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প্রকার, যা একটি sublcass Blob। এইভাবে এটি ব্যবহার করা যেতে পারে FileReader
সম্পূর্ণ কাজের দেখুন উদাহরণ


2
ফাইলরেডার এপিআই সম্পর্কে আরও পড়ুন: developer.mozilla.org/en-US/docs/Web/API/FileReader এবং ব্রাউজার সমর্থন: caniuse.com/#feat=filereader
লুকাশ লিসিস

7
আমি ফাংশনটি return reader.resultথেকে getBase64()(ব্যবহার না করে console.log(reader.result)) ব্যবহার করার চেষ্টা করেছি কারণ আমি বেস 64 কে ভেরিয়েবল হিসাবে ক্যাপচার করতে চাই (এবং তারপরে এটি গুগল অ্যাপস স্ক্রিপ্টে প্রেরণ করব)। আমি এর সাথে ফাংশনটি কল করেছি: var my_file_as_base64 = getBase64(file)এবং তারপরে কনসোলটি মুদ্রণের চেষ্টা করেছি console.log(my_file_as_base64 )এবং পেয়েছি undefined। আমি কীভাবে বেসকে 64 কে ভেরিয়েবলকে সঠিকভাবে নির্ধারণ করতে পারি?
ব্যবহারকারীর 1063287

1
আমি যদি কেউ উত্তর দিতে পারি তবে উপরের মন্তব্যটির বাইরে একটি প্রশ্ন করেছি। stackoverflow.com/questions/47195119/...
user1063287

আমার এই বেস 64 ফাইলটি একই ফাইলের নামের সাথে ব্রাউজারে খুলতে হবে, আমি উইন্ডো.ওপেন (url, '_blank') ব্যবহার করে এটি খুলছি যা ভাল কাজ করছে, আমি কীভাবে এই ফাইলটির নাম দেব? সাহায্য করুন.
মুনিশ শর্মা

ধন্যবাদ! আমি মনে করি এটি বিকাশকারী.মোজিলা.আর.এইজে
ইউএস

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
ক্রোম 69, প্রথম প্রতিস্থাপনটি হ'ল খালি ফাইলটি ধরা, দ্বিতীয় প্রতিস্থাপনটি হ'ল কমা - এনকোডড = পাঠক res
ব্যবহারকারী 3333134

আমার কথা, আমি সত্যিই সেই কোমাটি মিস করেছি। অবিশ্বাস্য বিষয়টি হ'ল এটি আমার ব্যাকএন্ডকে মোটেও বিরক্ত করছে বলে মনে হয় না, আমি এখনও ও _ ও সফলভাবে এক্সেল ফাইলগুলি আপলোড করতে সক্ষম হয়েছি। আমি আপনার খালি ফাইল ব্যবহারের কেসটিকেও অ্যাকাউন্টে নেওয়ার জন্য রেজেক্স ঠিক করেছি। ধন্যবাদ।
আরনাউদ পি

2
আমি একজন আরও সহজ সংস্করণ আছে: resolve(reader.result.replace(/^.*,/, ''));। যেহেতু কোমা ,বেস 64 বর্ণমালার বাইরে থাকে আমরা কোমা সহ আগত যে কোনও কিছু ছিনিয়ে নিতে পারি। stackoverflow.com/a/13195218/1935128
Johnride

মাথাগুলি আপ করার জন্য ধন্যবাদ, যদিও আমি এখানে রইগেক্স অনুসারে লিখেছি (আমার নিশ্চিত হওয়ার জন্য আবার পরীক্ষা করা দরকার), data:কোনও কমা ছাড়াই ঠিক থাকতে পারে , তাই আমি প্রথম অংশটি যেমন রাখি তেমন রাখব। আমি সেই অনুযায়ী উত্তর আপডেট করেছি।
আরনৌদ পি

1
@ আরনাডপি টাইপসক্রিপ্ট ত্রুটি: ধরণের স্ট্রিং | এ 'সম্পত্তি' প্রতিস্থাপন 'বিদ্যমান নেই ArrayBuffer '।
রোমেল গোমেজ

12

জাভাস্ক্রিপ্ট বিটিওএ () ফাংশনটি ডেটা বেস 64 এনকোড স্ট্রিংয়ে রূপান্তর করতে ব্যবহার করা যেতে পারে


6
btoa শুধুমাত্র স্ট্রিং দিয়ে কাজ করে। ফাইল সহ এটি কীভাবে ব্যবহার করবেন?
ভ্যাসিলি

10
আপনাকে প্রথমে ফাইলটি পড়তে হবে এবং তারপরে এটি এই ফাংশনে পাস করতে হবে .. jsfiddle.net/eliseosoto/JHQnk এর
প্রণব

1
@ প্রণবমনিয়ার আপনার ফিডাল আর কাজ করে না। আপনি লিঙ্ক আপডেট করতে পারেন?
ড্যান

5

এখানে একটি দম্পতি ফাংশন লিখেছি যাতে আমি একটি জসন ফর্ম্যাটে একটি ফাইল পেতে পারি যা সহজেই পাস করা যায়:

    //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]);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.