У меня есть следующий код, позволяющий пользователям загружать строки данных в файл csv.
exportData = 'data:text/csv;charset=utf-8,';
exportData += 'some csv strings';
encodedUri = encodeURI(exportData);
newWindow = window.open(encodedUri);
Он отлично работает: если клиент запускает код, он генерирует пустую страницу и начинает загрузку данных в файл csv.
Поэтому я попытался сделать это с помощью объекта JSON, например
exportData = 'data:text/json;charset=utf-8,';
exportData += escape(JSON.stringify(jsonObject));
encodedUri = encodeURI(exportData);
newWindow = window.open(encodedUri);
Но я вижу только страницу с отображенными на ней данными JSON, а не загружаю ее.
Я провел некоторое исследование, и этот утверждает, что работает, но я не вижу никакой разницы в своем коде.
Мне что-то не хватает в моем коде?
Спасибо, что прочитали мой вопрос :)
источник
var storageObj = []; for (var i=0; i<1000000; ++i) storageObj.push('aaa');
выдает сообщение «Ошибка загрузки - ошибка сети» в Chrome 61JSON.stringify(exportObj, null, 2)
вместо этогоНашел ответ.
var obj = {a: 123, b: "4 5 6"}; var data = "text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(obj)); $('<a href="data:' + data + '" download="data.json">download JSON</a>').appendTo('#container');
кажется, у меня работает нормально.
** Вся заслуга принадлежит @ cowboy-ben-alman, который является автором приведенного выше кода **
источник
Это будет чистая версия JS (адаптированная из ковбойской):
var obj = {a: 123, b: "4 5 6"}; var data = "text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(obj)); var a = document.createElement('a'); a.href = 'data:' + data; a.download = 'data.json'; a.innerHTML = 'download JSON'; var container = document.getElementById('container'); container.appendChild(a);
http://jsfiddle.net/sz76c083/1
источник
Вы можете попробовать использовать:
saveAs()
методСовершенно не нужно иметь дело с какими-либо элементами HTML.
var data = { key: 'value' }; var fileName = 'myData.json'; // Create a blob of the data var fileToSave = new Blob([JSON.stringify(data)], { type: 'application/json', name: fileName }); // Save the file saveAs(fileToSave, fileName);
Если вы хотите распечатать JSON в соответствии с этим ответом , вы можете использовать:
JSON.stringify(data,undefined,2)
источник
Для меня сработало следующее:
/* function to save JSON to file from browser * adapted from http://bgrins.github.io/devtools-snippets/#console-save * @param {Object} data -- json object to save * @param {String} file -- file name to save to */ function saveJSON(data, filename){ if(!data) { console.error('No data') return; } if(!filename) filename = 'console.json' if(typeof data === "object"){ data = JSON.stringify(data, undefined, 4) } var blob = new Blob([data], {type: 'text/json'}), e = document.createEvent('MouseEvents'), a = document.createElement('a') a.download = filename a.href = window.URL.createObjectURL(blob) a.dataset.downloadurl = ['text/json', a.download, a.href].join(':') e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null) a.dispatchEvent(e) }
а потом называть это так
saveJSON(myJsonObject, "saved_data.json");
источник
initMouseEvent()
это устаревший веб-стандарт, и его больше не следует использовать. Вместо этого используйтеnew MouseEvent()
интерфейс. Хотя это всего лишь небольшой рефакторинг.Недавно мне пришлось создать кнопку, которая загружала бы файл json со всеми значениями большой формы. Мне это нужно для работы с IE / Edge / Chrome. Вот что я сделал:
function download(text, name, type) { var file = new Blob([text], {type: type}); var isIE = /*@cc_on!@*/false || !!document.documentMode; if (isIE) { window.navigator.msSaveOrOpenBlob(file, name); } else { var a = document.createElement('a'); a.href = URL.createObjectURL(file); a.download = name; a.click(); } } download(jsonData, 'Form_Data_.json','application/json');
Была одна проблема с именем файла и расширением в Edge, но на момент написания это казалось ошибкой Edge, которая должна быть исправлена.
Надеюсь, это кому-то поможет
источник
document.body.appendChild(a); a.style.display = 'none';
чтобы она работала в Firefox.Простое и понятное решение для тех, кто ориентирован только на современные браузеры:
function downloadTextFile(text, name) { const a = document.createElement('a'); const type = name.split(".").pop(); a.href = URL.createObjectURL( new Blob([text], { type:`text/${type === "txt" ? "plain" : type}` }) ); a.download = name; a.click(); } downloadTextFile(JSON.stringify(myObj), 'myObj.json');
источник
В
download
Свойство ссылок является новым и не поддерживается в Internet Explorer (смотрите таблицу совместимости здесь ). Для кросс-браузерного решения этой проблемы я бы взглянул на FileSaver.jsисточник
Реагировать : добавьте это куда хотите в методе рендеринга.
• Объект в состоянии :
<a className="pull-right btn btn-primary" style={{ margin: 10 }} href={`data:text/json;charset=utf-8,${encodeURIComponent( JSON.stringify(this.state.objectToDownload) )}`} download="data.json" > DOWNLOAD DATA AS JSON </a>
• Объект в реквизите :
<a className="pull-right btn btn-primary" style={{ margin: 10 }} href={`data:text/json;charset=utf-8,${encodeURIComponent( JSON.stringify(this.props.objectToDownload) )}`} download="data.json" > DOWNLOAD DATA AS JSON </a>
className и style не являются обязательными, измените стиль в соответствии с вашими потребностями.
источник
Попробуйте установить другой MIME-тип:
exportData = 'data:application/octet-stream;charset=utf-8,';
Но могут возникнуть проблемы с именем файла в диалоге сохранения.
источник
data = "data:application/octet-stream;charset=utf-8," + encodeURIComponent(JSON.stringify(data)); window.open(data);
он просто загружает файл как "загрузить", но данные, которые я преобразовал в строку, а затем закодировали в кодировке uri, как и должно быть.Если вы предпочитаете фрагмент консоли, raser, а не имя файла, вы можете сделать это:
window.open(URL.createObjectURL( new Blob([JSON.stringify(JSON)], { type: 'application/binary'} ) ))
источник
downloadJsonFile(data, filename: string){ // Creating a blob object from non-blob data using the Blob constructor const blob = new Blob([JSON.stringify(data)], { type: 'application/json' }); const url = URL.createObjectURL(blob); // Create a new anchor element const a = document.createElement('a'); a.href = url; a.download = filename || 'download'; a.click(); a.remove(); }
Вы можете легко автоматически загрузить файл с помощью Blob и передать его в первом параметре downloadJsonFile. filename - имя файла, который вы хотите установить.
источник