Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Сохранение двоичных данных в файл (https://javascript.ru/forum/dom-window/77870-sokhranenie-dvoichnykh-dannykh-v-fajjl.html)

NiOl 27.06.2019 13:06

Сохранение двоичных данных в файл
 
Возникла ошибка при сохранении содержимого 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>


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

рони 27.06.2019 15:28

Цитата:

Сообщение от NiOl
"= () =>" - как это называется,

стрелочные функции - Функции через =>
onload = () => {let dat...}
это
window.onload = function(){let dat...}

Alexandroppolus 27.06.2019 18:16

Цитата:

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

new Blob([bf],

И revokeObjectURL потом не забыть, на всякий - по таймауту

Malleys 27.06.2019 23:32

Цитата:

Сообщение от 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>


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

NiOl 28.06.2019 01:22

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

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

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

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

3. "зачем вам нужно знать моё местоположение". На этот вопрос я ответить не могу, т.к. ... эээээ, мне и не нужно этого знать, и вроде в коде нет на это никакого намека, все чисто...

Malleys 28.06.2019 03:10

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

Цитата:

Сообщение от NiOl
А Консоль пользую реже, чем Алерт, т.к. мне так удобнее: не нужно переключаться на другое окно

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

Цитата:

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

А как вы такое соорудили или какой у вас браузер? В Google Chrome такой проблемы нет!

Цитата:

Сообщение от NiOl
И искать потом среди кучи мусора, где "мое" - проблематично.

В консоли в Chrome DevTools есть фильтр (и даже с регулярными выражениями) и live expressions. Уже не говоря о точках останова в виде logpoint.

Цитата:

Сообщение от NiOl
куцего линка

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

Цитата:

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

Я про то, что навязывание действия является плохим UX, независимо от действия!

Цитата:

Сообщение от NiOl
Вернее кнопок целых 16, что бы был выбор )))

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


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