Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   filereader конвертация картинки в Base64 (https://javascript.ru/forum/node-js-io-js/82490-filereader-konvertaciya-kartinki-v-base64.html)

Softy 15.05.2021 22:26

filereader конвертация картинки в Base64
 
Нашел в интернете функцию
function toDataURL(url, callback) {
  var xhr = new XMLHttpRequest();
  xhr.onload = function() {
    var reader = new FileReader();
    reader.onloadend = function() {
      callback(reader.result);
    }
    reader.readAsDataURL(xhr.response);
  };
  xhr.open('GET', url);
  xhr.responseType = 'blob';
  xhr.send();
}

toDataURL('https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0', function(dataUrl) {
  console.log('RESULT:', dataUrl)
})

установил filereader
запускаю в том виде в котором дано (в начале пробовал подсунуть свою ссылку. но не работает ни так ни так.
получаю
D:\Street\Test\node_modules\filereader\FileReader.js:266
        throw new Error("cannot read as File: " + JSON.stringify(file));
        ^

Error: cannot read as File: undefined
    at readFile (D:\Street\Test\node_modules\filereader\FileReader.js:266:15)
    at FileReader.self.readAsDataURL (D:\Street\Test\node_modules\filereader\FileReader.js:292:7)
    at exports.XMLHttpRequest.xhr.onload (D:\Street\Test\build\src\store\lookup.js:333:16)
    at exports.XMLHttpRequest.dispatchEvent (D:\Street\Test\node_modules\xmlhttprequest\lib\XMLHttpRequest.js:591:25)
    at setState (D:\Street\Test\node_modules\xmlhttprequest\lib\XMLHttpRequest.js:614:14)
    at IncomingMessage.<anonymous> (D:\Street\Test\node_modules\xmlhttprequest\lib\XMLHttpRequest.js:447:13)
    at IncomingMessage.emit (node:events:381:22)
    at endReadableNT (node:internal/streams/readable:1307:12)
    at processTicksAndRejections (node:internal/process/task_queues:81:21)


куда копать подскажите

Чтобы запустилось пришлось добавить
function toDataURL(url:string, callback:any) {
  var xhr = new XMLHttpRequest();
  xhr.onload = function() {
    var reader = new FileReader();
    reader.onloadend = function() {
      callback(reader.result);
    }
    reader.readAsDataURL(xhr.response);
  };
  xhr.open('GET', url);
  xhr.responseType = 'blob';
  xhr.send();
}

toDataURL('https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0', function(dataUrl:any) {
  logger.info('RESULT:', dataUrl)
})

рони 15.05.2021 22:32

Цитата:

Сообщение от Softy
куда копать подскажите

копать на сервер
Цитата:

Важное замечание: FileReader используется только для безопасным образом чтения содержимого файла из пользовательской (удалённой) системы. Его нельзя использовать для простого чтения файла по пути из файловой системы

Softy 15.05.2021 22:54

Оно всё хорошо. но почему не работает с тестовой картинкой как в примере. должно же

рони 15.05.2021 23:16

Цитата:

Сообщение от Softy
почему не работает с тестовой картинкой как в примере.

вроде всё работает :-?
<script>
function toDataURL(url, callback) {
    var xhr = new XMLHttpRequest();
    xhr.onload = function() {
        var reader = new FileReader();
        reader.onloadend = function() {
            callback(reader.result);
        }
        reader.readAsDataURL(xhr.response);
    };
    xhr.open('GET', url);
    xhr.responseType = 'blob';
    xhr.send();
}

toDataURL('https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0', function(dataUrl) {
    document.write(['RESULT: ', dataUrl])
})

    </script>

Alexandroppolus 17.05.2021 15:18

Softy,
это должно в Node.js работать? Тогда можно штатными средствами - загрузить Buffer и вызвать у него toString('base64')

Softy 18.05.2021 22:58

Цитата:

Сообщение от Alexandroppolus
Buffer

Спасибо получил и куда проще)
var request = require('request').defaults({ encoding: null });
var url = 'https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0';

function base64decode(urlnew, callback){
		request(urlnew, function (err, resp, buffer) {
      callback(buffer.toString('base64'));
});
};
 function cons1() {
	 console.log('Функция 1');
};
 function cons2() {
	 console.log('Функция 2');
};
base64decode(url, script => {
console.log(script);  
})
cons1();
cons2();
console.log('Просто консоль');


как можно остановить выполнение пока не вернется ответ с этой функции. а то у меня получается ответы
Функция 1
Функция 2
Просто консоль
iVBORw0KGgo..... (код картинки)

хотя функция получения base64 и стоит выше и запускается раньше.
Хотелось бы приостановить всё пока не вернется значение с первой функции
и еще вопрос. можно как то внутри функции base64decode присвоить значение переменной доступной из других функций (глобальная переменная)


Часовой пояс GMT +3, время: 14:40.