27.06.2019, 13:06
|
Интересующийся
|
|
Регистрация: 11.06.2017
Сообщений: 15
|
|
Сохранение двоичных данных в файл
Возникла ошибка при сохранении содержимого Uint8Array на диск, вместо двоичных данных получаю текст из десятичных представлений.
Сделано на работающем примере, с тем отличием, что в рабочем, чужом, скрипте, использовался несуществующий МИМЕ-тип "image/retrocomputer". Использовтать рабочий скрипт не могу по 2м причинам, одна - этическая, вторая - я не нашел описания конструкции
типа "onload = () => {let dat...}". яндекс вообще об выделенную часть споткнулся и мне пришлось чистить куки )))
(если кто может кинуть правильным названием, "= () =>" - как это называется, что бы можно было искать описание - спаибо!)
Вот вырезал саму "сохранялку", прошу найти ошибку!
ззы: На выходе получаю файл с содержимым " 255254 253252 251250 ... 228 227226 225224"
<!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.
Причина: добавил значение проблемного результата
|
|
27.06.2019, 15:28
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Сообщение от NiOl
|
"= () =>" - как это называется,
|
стрелочные функции - Функции через =>
onload = () => {let dat...}
это
window.onload = function(){let dat...}
Последний раз редактировалось рони, 27.06.2019 в 15:30.
|
|
27.06.2019, 18:16
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от NiOl
|
new Blob(bf,
|
new Blob([bf],
И revokeObjectURL потом не забыть, на всякий - по таймауту
|
|
27.06.2019, 23:32
|
|
Профессор
|
|
Регистрация: 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.
|
|
28.06.2019, 01:22
|
Интересующийся
|
|
Регистрация: 11.06.2017
Сообщений: 15
|
|
Всем большое спасибо за помощь!
Особенно за запихивание массива в массив, слазил на сайт мозиллы, так и есть, в описании тишина, но в примере используется.
"Упрощения" со "стрелочными" фукции буду изучать, но пока мне подобная запись не нравится, как-то привык к строгому стилю.
Malleys, сказать, что Вы меня удивили - ничего не сказать. По Вашей реакции кажется, что на этом форуме приходят только с вопросами, типа "мне срочно нужен спам-бот и вирус, и что бы Каспер не визжал" )))
Попытаюсь ответить на Ваши вопросы...
1. Про Алерт, и то, как я могу проверять, что массив все еще массив... Увы, очень часто я "теряю" массив и не сразу догадываюсь что вместо данных там "undefined". Этот Алерт не рабочий, а всего лишь для отладки. Весь этот код мне и не нужен, я его вытащил и собрал для поиска ошибки. А Консоль пользую реже, чем Алерт, т.к. мне так удобнее: не нужно переключаться на другое окно, что бы увидеть результаты, и главное, в Алерте будут только мои данные, а в лог сыпятся ошибки сразу из нескольких десятков открытых окон (в том числе и с этого сайта), т.к. он общий для всех. И искать потом среди кучи мусора, где "мое" - проблематично. Так что "Да, я так могу!" )))
2. Про навязчивое скачивание (ржал). Пытаюсь сделать, что бы страничка была больше похожа на приложение, чем на страничку, поэтому вместо куцего линка использую полноценную кнопку, к которой подвязана сохранялка. Вернее кнопок целых 16, что бы был выбор ))) Для очистки совести, прикладываю черновичек того, что есть, сразу видно, что пользователь сам вибирает, нужно ли ему чего сохранять тили нет ))) Только на превьюшке не видно не фига, движок пережимает.
3. "зачем вам нужно знать моё местоположение". На этот вопрос я ответить не могу, т.к. ... эээээ, мне и не нужно этого знать, и вроде в коде нет на это никакого намека, все чисто...
|
|
28.06.2019, 03:10
|
|
Профессор
|
|
Регистрация: 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.
|
|
|
|