Как конвертировать файл в base64 в JavaScript?
теперь я получаю объект File по этой строке:
file = document.querySelector('#files > input[type="file"]').files[0]
Мне нужно отправить этот файл через json в базе 64. Что я должен сделать, чтобы преобразовать его в строку base64?
5 ответов:
попробуйте решение с помощью
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
.
Смотрите полный рабочий пример.
Если вы ищете решение на основе обещаний, это код @Dmitri, адаптированный для этого:
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) );
JavaScript btoa () функция может быть использована для преобразования данных в кодированную строку base64
строительство на Дмитрия Павлутина и Джошуа.paling answers, вот Расширенная версия, которая извлекает содержимое base64 (удаляет метаданные в начале), а также обеспечивает набивка сделано правильно.
function getBase64(file) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => { let encoded = reader.result.replace(/^data:(.*;base64,)?/, ''); if ((encoded.length % 4) > 0) { encoded += '='.repeat(4 - (encoded.length % 4)); } resolve(encoded); }; reader.onerror = error => reject(error); }); }
вот несколько функций, которые я написал, чтобы получить файл в формате 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);