Javascript.RU

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

Сохранение двоичных данных в файл
Возникла ошибка при сохранении содержимого Uint8Array на диск, вместо двоичных данных получаю текст из десятичных представлений.

Сделано на работающем примере, с тем отличием, что в рабочем, чужом, скрипте, использовался несуществующий МИМЕ-тип "image/retrocomputer". Использовтать рабочий скрипт не могу по 2м причинам, одна - этическая, вторая - я не нашел описания конструкции
типа "onload = () => {let dat...}". яндекс вообще об выделенную часть споткнулся и мне пришлось чистить куки )))
(если кто может кинуть правильным названием, "= () =>" - как это называется, что бы можно было искать описание - спаибо!)

Вот вырезал саму "сохранялку", прошу найти ошибку!

ззы: На выходе получаю файл с содержимым "255254253252251250 ... 228227226225224"

<!DOCTYPE html>
<html><head>
<meta charset="utf-8">
</head>
<body>
<a id="FileSaver" style="display:none;"></a>
<p>Test for bin files saving...</p>

<script> 
  const FS=document.getElementById("FileSaver");
  var bf=new Uint8Array(32);	// Буфер двоичных данных для примера

  for (i=0;i<bf.length;i++)
    {bf[i]=~i;}			// Кидаем в буфер некие "полезные" данные

  save(bf);

  function save(bf) {
    alert('size:'+bf.length); 	// Проверяем, не потерян ли массив?

    let blb=new Blob(bf,{type:'application/octet-stream'});
    const Data=URL.createObjectURL(blb);
    FS.href=Data;
    FS.download="probe.bin";
    FS.click();
    }
</script>
</body>
</html>


зы: линк использую статический, т.к. он "многоразвого использования", а обычно у всех создается дом-объект, который тут же удаляется, но уверен, проблема не в этом.

Последний раз редактировалось NiOl, 27.06.2019 в 13:09. Причина: добавил значение проблемного результата
Ответить с цитированием
  #2 (permalink)  
Старый 27.06.2019, 15:28
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

Сообщение от NiOl
"= () =>" - как это называется,
стрелочные функции - Функции через =>
onload = () => {let dat...}
это
window.onload = function(){let dat...}

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

Сообщение от NiOl
new Blob(bf,
new Blob([bf],

И revokeObjectURL потом не забыть, на всякий - по таймауту
Ответить с цитированием
  #4 (permalink)  
Старый 27.06.2019, 23:32
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от NiOl
Вот вырезал саму "сохранялку", прошу найти ошибку!
Хотя оно и сохраняет, но это очень плохой UX! Пользователь сам должен решать, что ему скачивать, а что нет! Вы должны предоставить такую возможность!

Цитата:
// alert('size:'+bf.length); // программирование в стиле написал-перезагрузил-нажал? О консоли не слышали?
// Проверяем, не потерян ли массив? КАК ВЫ ТАК МОЖЕТЕ!!!
// link.click(); // удалите навязчивое скачивание



<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
</head>

<body>
	<p>File saving test...</p>
	<a id="fileSaver">Save</a>

	<script>
		const link = document.getElementById("fileSaver");
		const buffer = new Uint8Array(32);
		
		for(let i = 0; i < buffer.length; i++) {
			buffer[i] = ~i;
		}
		
		save(buffer);

		function save(buffer) {
			let blob = new Blob([buffer], {
				type: "application/octet-stream"
			});
			
			const url = URL.createObjectURL(blob);
			link.href = url;
			link.download = "probe.bin";
		}
	</script>
</body>

</html>


Почему это нужно именно так? Потому я как пользователь совершенно не понимаю, зачем мне нужны эти уведомления, зачем вам нужно знать моё местоположение и зачем мне нужен этот файл! Сначала расскажите что это, зачем это, а мы уж решим надо нам это или нет! И нажмём на кнопку! А то как вы предлагаете, однозначно Отмена!

Последний раз редактировалось Malleys, 27.06.2019 в 23:38.
Ответить с цитированием
  #5 (permalink)  
Старый 28.06.2019, 01:22
Интересующийся
Отправить личное сообщение для NiOl Посмотреть профиль Найти все сообщения от NiOl
 
Регистрация: 11.06.2017
Сообщений: 15

Всем большое спасибо за помощь!
Особенно за запихивание массива в массив, слазил на сайт мозиллы, так и есть, в описании тишина, но в примере используется.

"Упрощения" со "стрелочными" фукции буду изучать, но пока мне подобная запись не нравится, как-то привык к строгому стилю.

Malleys, сказать, что Вы меня удивили - ничего не сказать. По Вашей реакции кажется, что на этом форуме приходят только с вопросами, типа "мне срочно нужен спам-бот и вирус, и что бы Каспер не визжал" )))
Попытаюсь ответить на Ваши вопросы...
1. Про Алерт, и то, как я могу проверять, что массив все еще массив... Увы, очень часто я "теряю" массив и не сразу догадываюсь что вместо данных там "undefined". Этот Алерт не рабочий, а всего лишь для отладки. Весь этот код мне и не нужен, я его вытащил и собрал для поиска ошибки. А Консоль пользую реже, чем Алерт, т.к. мне так удобнее: не нужно переключаться на другое окно, что бы увидеть результаты, и главное, в Алерте будут только мои данные, а в лог сыпятся ошибки сразу из нескольких десятков открытых окон (в том числе и с этого сайта), т.к. он общий для всех. И искать потом среди кучи мусора, где "мое" - проблематично. Так что "Да, я так могу!" )))

2. Про навязчивое скачивание (ржал). Пытаюсь сделать, что бы страничка была больше похожа на приложение, чем на страничку, поэтому вместо куцего линка использую полноценную кнопку, к которой подвязана сохранялка. Вернее кнопок целых 16, что бы был выбор ))) Для очистки совести, прикладываю черновичек того, что есть, сразу видно, что пользователь сам вибирает, нужно ли ему чего сохранять тили нет ))) Только на превьюшке не видно не фига, движок пережимает.

3. "зачем вам нужно знать моё местоположение". На этот вопрос я ответить не могу, т.к. ... эээээ, мне и не нужно этого знать, и вроде в коде нет на это никакого намека, все чисто...
Изображения:
Тип файла: jpg 2019-06-28_003116.jpg (20.5 Кб, 5 просмотров)
Ответить с цитированием
  #6 (permalink)  
Старый 28.06.2019, 03:10
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Я про то, что зачем столько рутины! Хотя вам может быть не понятно, поскольку вы очевидно не используете hot reloading. Это позволяет печатать в редакторе и сразу наблюдать изменения после сохранения, а если будут всё время выскакивать модальные окна и диалоговые окна для сохранения файла, то их же придётся всё время закрывать!

Сообщение от NiOl
А Консоль пользую реже, чем Алерт, т.к. мне так удобнее: не нужно переключаться на другое окно
Консоль можно подсоединить к вкладке (что обычно уже сделано по умолчанию) и можно просто смотреть туда, а alert нужно закрывать, и там просто текст (вы не можете инспектировать живой объект, уже не говоря, что бы в нём что-то поменять!)

Сообщение от NiOl
а в лог сыпятся ошибки сразу из нескольких десятков открытых окон (в том числе и с этого сайта), т.к. он общий для всех.
А как вы такое соорудили или какой у вас браузер? В Google Chrome такой проблемы нет!

Сообщение от NiOl
И искать потом среди кучи мусора, где "мое" - проблематично.
В консоли в Chrome DevTools есть фильтр (и даже с регулярными выражениями) и live expressions. Уже не говоря о точках останова в виде logpoint.

Сообщение от NiOl
куцего линка
HTML не для визуального представления, CSS в помощь!

Сообщение от NiOl
3. "зачем вам нужно знать моё местоположение". На этот вопрос я ответить не могу, т.к. ... эээээ, мне и не нужно этого знать, и вроде в коде нет на это никакого намека, все чисто...
Я про то, что навязывание действия является плохим UX, независимо от действия!

Сообщение от NiOl
Вернее кнопок целых 16, что бы был выбор )))
Вы рассказали про кнопки, значит у вас пользователь может сам решать, а не закрывать 16 окошек для сохранения файла! И это хорошо!

Последний раз редактировалось Malleys, 28.06.2019 в 03:12.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Node js Нейронные сети сохранение в файл grigandal Node.JS 0 23.10.2018 15:27
Считывание и запись данных в файл Nextmap Общие вопросы Javascript 9 17.10.2018 14:57
Вывод данных из БД в .js файл Loromir jQuery 5 18.12.2014 17:38
Сохранение данных в файл Autosof Общие вопросы Javascript 1 28.08.2008 09:23
Сохранение данных на стороне клиента средствами Javascript baal1988 Events/DOM/Window 4 24.08.2008 21:32