Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.11.2018, 10:00
Аспирант
Отправить личное сообщение для Svorg Посмотреть профиль Найти все сообщения от Svorg
 
Регистрация: 16.11.2018
Сообщений: 38

Сохранить значение переменной {...} на диск в виде 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 вместо скачивания стал писать:
Цитата:
Без названия
Ошибка: Ошибка сети.
Подскажите пожалуйста, что с этим можно придумать...
Ответить с цитированием
  #2 (permalink)  
Старый 25.11.2018, 10:01
Аспирант
Отправить личное сообщение для Svorg Посмотреть профиль Найти все сообщения от Svorg
 
Регистрация: 16.11.2018
Сообщений: 38

И что-то я не смог найти нормального источника по "href data" и полный список что вообще можно ставить вместо "application/octet-stream" (с особенностями последних)...
Ответить с цитированием
  #3 (permalink)  
Старый 25.11.2018, 12:34
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

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);

Последний раз редактировалось j0hnik, 25.11.2018 в 18:05.
Ответить с цитированием
  #4 (permalink)  
Старый 25.11.2018, 13:20
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

Сообщение от Svorg Посмотреть сообщение
И что-то я не смог найти нормального источника по "href data" и полный список что вообще можно ставить вместо "application/octet-stream" (с особенностями последних)...
Это стандарт data: URL.
А ставить можно что угодно, это MIME-types

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

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

Последний раз редактировалось Aetae, 25.11.2018 в 13:40.
Ответить с цитированием
  #5 (permalink)  
Старый 25.11.2018, 14:55
Аспирант
Отправить личное сообщение для Svorg Посмотреть профиль Найти все сообщения от Svorg
 
Регистрация: 16.11.2018
Сообщений: 38

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

Но теперь просто интересно, а что же не так было с кодом в #1?
Опробовал в нём менять на "text/plain" или "application/json" - без улучшений.
Сократил encodeURIComponent() на encodeURI(), потом вообще убрал - без улучшений.
Ответить с цитированием
  #6 (permalink)  
Старый 25.11.2018, 15:15
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

Svorg, с первым кодом было просто ограничение максимальной длины url. Data: url тот ещё костыль по сути, просто запихивающий данные прям в адресную строку.)
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 25.11.2018, 18:06
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Aetae,
Поправил, хорошее замечание
Ответить с цитированием
  #8 (permalink)  
Старый 01.12.2018, 16:34
Интересующийся
Отправить личное сообщение для VSEM-DOBRA Посмотреть профиль Найти все сообщения от VSEM-DOBRA
 
Регистрация: 01.10.2017
Сообщений: 20

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить значение переменной в функции Addeuss jQuery 3 01.10.2017 13:20
Как сделать так, чтобы значение переменной не возвращалось на исходное значение? E}|{uk Общие вопросы Javascript 1 21.12.2014 15:26
Значение переменной через запятую DDSSDD Серверные языки и технологии 41 16.10.2014 15:01
Загрузка большого json файла uncher4 AJAX и COMET 1 23.06.2014 22:54
Как получить значение переменной из другого файла js? Ser_Maxim Javascript под браузер 4 07.11.2009 09:35