Как загрузить строку JavaScript в виде файла - PullRequest
4 голосов
/ 19 февраля 2009

Приложение запрашивает данные KML через AJAX с сервера. Эти данные хранятся в переменных javascript и отображаются в плагине Google Планета Земля.

В javascript, как я могу предоставить ссылку для загрузки данных KML, хранящихся в переменной javascript (в виде строки), без запроса запроса на сервер?

Эта ссылка: http://forum.mootools.net/viewtopic.php?id=9728

предлагает использовать URI данных, но это, вероятно, не будет работать в достаточном количестве браузеров для моих нужд. Возможно, проще всего просто вернуться на сервер, чтобы снова получить данные для загрузки, но любопытно, справился ли кто-нибудь с javascript.

Ответы [ 7 ]

3 голосов
/ 19 февраля 2009

Краткий ответ: вы не можете и все еще не зависеть от платформы. Большинство браузеров просто не позволяют javascript манипулировать файловой системой.

Тем не менее, вы можете избежать неприятностей, связанных с платформой. Например, IE предлагает функцию execCommand, которую вы можете использовать для вызова SaveAs. Если вы сделали это в IFrame, в котором были данные, которые вы хотели сохранить, вы могли бы заставить их работать - но только в IE. Другие варианты (опять же, я собираюсь использовать Microsoft здесь) включают этот взлом Silverlight или элементы управления ActiveX.

Я думаю, что для полной совместимости с платформой вам просто придется смириться с этим и предоставить возможность загрузки на стороне сервера.

[Изменить] Упс! Я не проявил должной осмотрительности, когда пошел на поиски ссылок. Оказывается, хак Silverlight, с которым я связан, имеет компонент на стороне сервера. Похоже, ты симпатичный SOL.

[Edit2] Я нашел хороший обзор совместимости браузера для execCommand здесь . Хотя в нем перечислены вопросительные знаки для команды «saveas», возможно, в конце концов это может быть хорошим способом для вас. Возможно, стоит попробовать?

[Edit3] Ну, я решил проверить концепцию предложенного мною подхода, и у меня получилось нечто довольно простое в IE. К сожалению, в процессе я доказал, что этот подход не будет работать для Firefox и, похоже, не работает в Chrome / Safari. Так что это очень зависит от платформы. Но это работает! Вот полная рабочая страница:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Javascript File Saver</title>
    <script type="text/javascript">
      function PageLoad() {
        var fdoc = window.frames["Frame"].document;
        fdoc.body.appendChild(fdoc.createTextNode("foo,bar,baz"));
      }
      function Save() {
        var fdoc = window.frames["Frame"].document;
        fdoc.execCommand("SaveAs", true);
      }
    </script>
</head>
<body onload="PageLoad();">
<h2>Javascript File Saver</h2>
<iframe id="Frame" style="width: 400px;">Noframe</iframe><br />
<button onclick="Save();">Save</button>
</body>
</html>
2 голосов
/ 26 октября 2015

Выезд http://regany.com/blog/2014/05/30/convert-a-string-to-a-download-file-in-javascript/

Включить всплывающие окна и использовать следующий код:

var str = "the string you wan't to download";
window.open('data:text/plain,' + encodeURIComponent(str));
2 голосов
/ 14 апреля 2012

Вы можете проверить это: оно называется Downloadify . Он использует смесь Javascript и Flash и может сохранить строку практически в любом формате. Попробуйте демо и убедитесь сами!

2 голосов
/ 20 февраля 2009

Да, боюсь, вы должны передать его обратно на сервер. Создайте общий сценарий «echo», который выдает все параметры, которые ему передаются.

По крайней мере, вы можете принудительно загрузить с правильным MIME-типом:

"content-disposition","attachment; filename=data.xml"
1 голос
/ 05 августа 2012

Вы, вероятно, могли бы использовать функцию parseKml для анализа данных kml в переменной javascript вместо того, чтобы пытаться сохранить их в файле и модифицировать их из javascript (что я не считаю возможным по соображениям безопасности)

https://developers.google.com/earth/documentation/kml

1 голос
/ 10 февраля 2012

Возможно, это будет полезно (вариант JSP):

    private void printSaveStringButton(String fileName, String content) throws Exception {
        //add new invisible container with write / save functions
        out.println("<iframe id=\"xmlContentId\" style=\"display:none;\"></iframe>");
        //save string in js variable
        String jScript = "\n" +
                "var SaveHelper = {\n" +
                "    content : null,\n" +
                "    saveContent : function(filename, text) {\n" +
                "        text=(SaveHelper.content!=null)?SaveHelper.content:text;\n" +
                "        var doc = document.getElementById('xmlContentId').contentWindow.document;\n" +
                "        doc.write(text);\n" +
                "        doc.execCommand(\"saveAs\",true,filename);\n" +
                "        doc.close();\n" +
                "    }\n" +
                "};\n" +
                "SaveHelper.content = '" + org.apache.commons.lang.StringEscapeUtils.escapeJavaScript(content) + "';\n";
        out.println("<script type=\"text/javascript\">" + jScript + "</script>");
        //add button that writes content into iframe container and show save dialog.
        out.println("<button type=\"button\" onclick=\"SaveHelper.saveContent('"+fileName+"' )\">Save as...</button>");
    }
0 голосов
/ 19 февраля 2009

Честно говоря, я не думаю, что это возможно. Никогда не предполагалось, что это может быть сделано в JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...