Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сохранить значение переменной {...} на диск в виде json-файла. (https://javascript.ru/forum/misc/76017-sokhranit-znachenie-peremennojj-%7B-%7D-na-disk-v-vide-json-fajjla.html)

Svorg 25.11.2018 10:00

Сохранить значение переменной {...} на диск в виде json-файла.
 
Непосредственно задача:
  • Всё только на клиенте. Основной целевой браузер - Chrome.
  • Есть переменная-объект: var Test = {...};
  • Надо сохранить "её" в виде json-файла на диск. Желательно без дёргания пользователя.
  • P/S, а если решу оформить мою байду в виде расширения Chrome - появятся ли новые возможности?
Накопал в сети такое:
function objSave(Obj) {
  let Temp = document.createElement('A');
  Temp.href = 'data:application/octet-stream;charset=windows-1251,' + encodeURIComponent(JSON.stringify(Obj, null, 2));
  Temp.download = 'file_' + (Date.now() / 1000 | 0) + '.json';
  document.body.appendChild(Temp);
  Temp.click();
  document.body.removeChild(Temp);
};
Оно даже работало, пока объект был мелким.
Но когда объект серьёзно "распух", Chrome вместо скачивания стал писать:
Цитата:

Без названия
Ошибка: Ошибка сети.
Подскажите пожалуйста, что с этим можно придумать...

Svorg 25.11.2018 10:01

И что-то я не смог найти нормального источника по "href data" и полный список что вообще можно ставить вместо "application/octet-stream" (с особенностями последних)...

j0hnik 25.11.2018 12:34

var saveJson = function(obj) {
	var str = JSON.stringify(obj);
	var blob = new Blob( [  str ], {
		type: 'application/octet-stream'
	});
	
	var url = URL.createObjectURL( blob );
	var link = document.createElement( 'a' );
	link.setAttribute( 'href', url );
	link.setAttribute( 'download', 'data.json' );
	var event = document.createEvent( 'MouseEvents' );
	event.initMouseEvent( 'click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
	link.dispatchEvent( event );
}

var obj = [];
for(var i = 0; i<100000; i++) obj.push(Math.random());
saveJson(obj);

Aetae 25.11.2018 13:20

Цитата:

Сообщение от Svorg (Сообщение 499319)
И что-то я не смог найти нормального источника по "href data" и полный список что вообще можно ставить вместо "application/octet-stream" (с особенностями последних)...

Это стандарт data: URL.
А ставить можно что угодно, это MIME-types

Решение же самой проблемы - выше, хотя и излишне заморочен.)

j0hnik, blob может принимать строку, не надо её кодировать.)

Svorg 25.11.2018 14:55

Спасибо за ссылки! Откапал к ним в добавок такую: Список MIME-типов.
Пример из #3 очень помог, работает, по крайней мере файлы под 40МБ точно осиливает, огромное спасибо!
А вот blob/url/link/event не надо как-то явно освобождать случайно?

Но теперь просто интересно, а что же не так было с кодом в #1?
Опробовал в нём менять на "text/plain" или "application/json" - без улучшений.
Сократил encodeURIComponent() на encodeURI(), потом вообще убрал - без улучшений.

Aetae 25.11.2018 15:15

Svorg, с первым кодом было просто ограничение максимальной длины url. Data: url тот ещё костыль по сути, просто запихивающий данные прям в адресную строку.)

j0hnik 25.11.2018 18:06

Aetae,
Поправил, хорошее замечание

VSEM-DOBRA 01.12.2018 16:34

Можно ли таким способом сохранять текущую страницу в PDF? что надо поменять?


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