Как я могу динамически создавать документ для загрузки в Javascript?
Я пишу код Javascript, который генерирует XML-документ в клиенте (через плагин Google Earth). Я хочу, чтобы пользователь мог нажать кнопку на странице и получить запрос на сохранение этого XML в новый файл. Если бы я создавал серверную часть XML, это было бы просто, просто запустите кнопку, чтобы открыть ссылку. Но XML создается клиентской стороной.
Я придумал пару хаков, которые частично работают, частично вдохновленные qaru.site/info/391684/.... Но ни одна из них не работает. Вот демонстрационный HTML со встроенным кодом:
<html><head><script>
function getData() { return '<?xml version="1.0" encoding="UTF-8"?><doc>Hello</doc>'; }
function dlDataURI() {
window.open("data:text/xml;charset=utf-8," + getData());
}
function dlWindow() {
var w = window.open();
w.document.open();
w.document.write(getData());
w.document.close();
}
</script><body>
<div onclick="dlDataURI()">Click for Data URL</div>
<div onclick="dlWindow()">Click for Window</div>
</body></html>
Версия dlDataURI() отлично работает в Firefox, плохо в Chrome (не удается сохранить), а вовсе не в IE. Версия Window() работает нормально в Firefox и IE, а не в Chrome (не может сохранять XML, встроенный внутри HTML). Ни одна из версий никогда не запрашивает загрузку пользователя, она всегда открывает новое окно, пытающееся отобразить XML.
Есть ли хороший способ сделать то, что я хочу на стороне Javascript? Я бы хотел, чтобы это работало в современных браузерах, в идеале Firefox, MSIE 8 и Chrome.
Обновление с помощью образца кода для загрузки
window.onload = function() {
Downloadify.create("dlify", {
data: getData(),
filename: "data.xml",
swf: 'media/downloadify.swf',
downloadImage: 'images/download.png',
width: 100, height: 30});};
Ответы
Ответ 1
Лучшее, что я видел до сих пор, Downloadify Дуг Нейнер, он требует Flash, но работает очень хорошо:
"Крошечная библиотека JavaScript + Flash, которая позволяет генерировать и сохранять файлы" на лету "в браузере без взаимодействия с сервером".
Отметьте это видео.
Ответ 2
Если Flash является опцией, Flash Player (версия 10+) предлагает средства для ограниченного чтения/записи файлов из локальной файловой системы.
Проверьте это:
http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/net/FileReference.html#save%28%29