Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.03.2018, 13:52
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

Как вернуть blob из img.src?
<!doctype html><meta charset='utf-8'><title>BLOB</title>
<div id='BOX'></div>
<input id='FI' type='file' multiple>

<style>
	#BOX{display:flex;flex-wrap:wrap}
	img{width:300px;padding:10px}
</style>

<script>

	function getBlobFromSrc(e){
	  let img=e.target, strBlob=e.target.src;
	  console.log(strBlob);		// Что нужно сделать, чтобы снова отобразить blob а не строку
	};

	function Store(blob){ console.log(blob);
	  let img=new Image;
	  img.src=URL.createObjectURL(blob);
	  img.addEventListener('click',getBlobFromSrc);
	  BOX.append(img);
	};

	FI.onchange=e=>{
	  let i, n=e.target.files, r;
	  for(i of n){
	    r=new FileReader;
	    r.readAsDataURL(i);
	    r.onload=e=>fetch(e.target.result)
	     .then(i=>i.blob())
	     .then(i=>Store(i))
	  }
	};

</script>

Загрузите несколько картинок, откройте консоль и пройдитесь кликом по каждой из них.
Что делать не знаю. Неужели придется городить new Blob(...)?
Такое ощущение, что после вставки blob в src картинки, мы его теряем (
 
Ответить с цитированием
  #2 (permalink)  
Старый 09.03.2018, 14:15
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Teamur,
<!doctype html><meta charset='utf-8'><title>BLOB</title>
<div id='BOX'></div>
<input id='FI' type='file' multiple>

<style>
  #BOX{display:flex;flex-wrap:wrap}
  img{width:300px;padding:10px}
</style>

<script>
   "use strict"
  function getBlobFromSrc(blob){
   return function(e) {
    let img=e.target, strBlob=e.target.src;
    console.log(strBlob);
    console.log(blob);
    }

    		// Что нужно сделать, чтобы снова отобразить blob а не строку
  };

  function Store(blob){ console.log(blob);
    let img=new Image;
    img.src=URL.createObjectURL(blob);
    img.addEventListener('click',getBlobFromSrc(blob));
    BOX.append(img);
  };

  FI.onchange=e=>{
    let i, n=e.target.files, r;
    for(i of n){
      r=new FileReader;
      r.readAsDataURL(i);
      r.onload=e=>fetch(e.target.result)
       .then(i=>i.blob())
       .then(i=>Store(i))
    }
  };

</script>
Ответить с цитированием
  #3 (permalink)  
Старый 09.03.2018, 14:22
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

рони,
это понятно ))

Но мне нужно, не передать blob, а именно получить его из img.src.

blob -> img.src
img.src -> blob?

img.src формата 'blob:......' -> blob

Последний раз редактировалось Teamur, 09.03.2018 в 14:25.
Ответить с цитированием
  #4 (permalink)  
Старый 09.03.2018, 15:10
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Teamur
img.src формата 'blob:......'
я так понимаю, в img.src находится результат URL.createObjectURL ?
тогда просто "скачай" данные по этой ссылке с помощью fetch, верни результат как 'blob'
Ответить с цитированием
  #5 (permalink)  
Старый 09.03.2018, 15:15
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

Alexandroppolus,
да - результат URL.createObjectURL !

Правильно ли я понимаю, что в img.src строка, а не blob?
Просто ссылка на blob, который нужно скачать, по сути?

Попробую ...
Ответить с цитированием
  #6 (permalink)  
Старый 09.03.2018, 15:26
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

<!doctype html><meta charset='utf-8'><title>BLOB</title>
<div id='BOX'></div>
<input id='FI' type='file' multiple>

<style>
  #BOX{display:flex;flex-wrap:wrap}
  img{width:300px;padding:10px}
</style>

<script>

	function getBlobFromSrc(e){
	  let img=e.target, strBlob=e.target.src;
	  console.log(strBlob);
	  fetch(strBlob)
	    .then(i=>i.blob())
	    .then(i=>console.log(i)) // -> blob
	};

	function Store(blob){ console.log(blob);
	  let img=new Image;
	  img.src=URL.createObjectURL(blob);
	  img.addEventListener('click',getBlobFromSrc);
	  BOX.append(img);
	};

	FI.onchange=e=>{
	  let i, n=e.target.files, r;
	  for(i of n){
	    r=new FileReader;
	    r.readAsDataURL(i);
	    r.onload=e=>fetch(e.target.result)
	      .then(i=>i.blob())
	      .then(i=>Store(i))
	  }
	};

</script>


Так работает!

Кстати использовать fetch в данном примере рационально?

Было бы круто все это обернуть в Promise да еще добавить async/await.
Но я не понимаю как это сделать.

Последний раз редактировалось Teamur, 09.03.2018 в 15:35.
Ответить с цитированием
  #7 (permalink)  
Старый 09.03.2018, 16:32
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Teamur
Правильно ли я понимаю, что в img.src строка, а не blob?
Просто ссылка на blob, который нужно скачать, по сути?
да, в src всегда строка

Сообщение от Teamur
Кстати использовать fetch в данном примере рационально?

Было бы круто все это обернуть в Promise да еще добавить async/await.
Но я не понимаю как это сделать.
не надо ничего оборачивать.
fetch и так возвращает промис. Просто используй async/await - это по сути синтаксическая надстройка над промисами. Всё уже есть.
Ответить с цитированием
  #8 (permalink)  
Старый 09.03.2018, 16:41
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

Alexandroppolus,
спасибо за помощь и советы!
Ответить с цитированием
  #9 (permalink)  
Старый 10.08.2018, 12:11
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

Продолжаю тему )
В indexedDB хранится BLOB string, взятый из img.src.
Каким образом мне превратить BLOB string в BLOB, если fetch лезет на сервер?

fetch(blobStringfromIndexedDB)


Неужели придется использовать методы canvas для получения BLOB?
Или можно каким-то образом сказать fetch 'Не лезь на сервер' )
Спасибо!

Последний раз редактировалось Teamur, 10.08.2018 в 12:28.
Ответить с цитированием
  #10 (permalink)  
Старый 10.08.2018, 12:27
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Teamur
В indexedDB хранится BLOB string
что за "BLOB string"?
если это результат URL.createObjectURL, то он бесполезен

или там что-то другое? вообще говоря, в indexedDB можно хранить блобы как есть
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вернуть результат из ajax внутри функции? Rooner AJAX и COMET 4 29.03.2013 19:15
Как вернуть контент на нужном языке в зависимости от того, что за фрукт зашел на сайт Shitbox2 Общие вопросы Javascript 11 10.03.2013 12:50
Как вернуть html-код с чужого сайта?!! Delovar jQuery 8 28.02.2013 04:14
Как сделать как в JQ? faforty Общие вопросы Javascript 8 14.11.2011 01:35
Подскажите, как вернуть js-скрипт массив Polkan AJAX и COMET 18 30.04.2010 23:30