Создайте XML в JavaScript, попросите пользователя сохранить его - PullRequest
16 голосов
/ 09 февраля 2010

Я хотел бы создать XML-документ на JavaScript, а затем отобразить диалоговое окно сохранения.

  1. Это нормально, если они должны нажать, прежде чем может произойти сохранение.
  2. Это * не * нормально, если я * должен * использовать IE для достижения этой цели (мне даже не нужно его поддерживать). Однако Windows является обязательной платформой (поэтому Firefox или Chrome являются предпочтительными браузерами, если я могу сделать это только в одном браузере).
  3. Это * не * хорошо, если мне нужен веб-сервер. Но, наоборот, я не хочу требовать, чтобы JavaScript запускался только для локального файла, то есть повышенных привилегий - если это возможно. То есть я хотел бы запускать локально или на * статическом * хосте. Но только на месте все в порядке.
  4. Это нормально, чтобы наклониться назад, чтобы сделать это. Файл не будет очень большим, но доступ к Интернету может быть или нет, быть ненадежным или вообще отсутствовать - см. (3).

Пока единственные идеи, которые я видел, - это сохранить XML в iframe и сохранить этот документ - но кажется, что вы можете сделать это только в IE? Кроме того, чтобы я мог создать URI данных и поместить его в ссылку. Я боюсь, что он просто откроет файл XML в окне, а не предложит пользователю сохранить его.

Я знаю, что если мне потребуется, чтобы JavaScript был локальным, я могу повысить привилегии и просто сохранить файл напрямую (или, надеюсь, вызвать диалоговое окно сохранения). Однако я бы предпочел решение, в котором мне не требуются повышенные привилегии (даже решение только для Firefox 3.6).

Я прошу прощения, если это оскорбляет чью-либо чувствительность (например, не поддерживает каждый браузер). Я в основном хочу написать автономное приложение, и Javascript / HTML / CSS, кажется, лучший кандидат, учитывая сложность требований и доступное время. Однако у меня есть единственное требование - сохранять данные, которые необходимо преодолеть, прежде чем я смогу выбрать эту линию разработки.

Ответы [ 9 ]

6 голосов
/ 20 февраля 2010

Как насчет этого downloadify сценария?

На основе Flash и jQuery, который может предложить вам диалоговое окно для сохранения файла на вашем компьютере.

Downloadify.create('downloadify',{
  filename: function(){
    return document.getElementById('filename').value;
  },
  data: function(){ 
    return document.getElementById('data').value;
  },
  onComplete: function(){ 
    alert('Your File Has Been Saved!'); 
  },
  onCancel: function(){ 
    alert('You have cancelled the saving of this file.');
  },
  onError: function(){ 
    alert('You must put something in the File Contents or there will be nothing to save!'); 
  },
  swf: 'media/downloadify.swf',
  downloadImage: 'images/download.png',
  width: 100,
  height: 30,
  transparent: true,
  append: false
});
4 голосов
/ 01 апреля 2012

Используя URI данных в кодировке base64, это возможно только для html & js. Что вы можете сделать, это закодировать данные, которые вы хотите сохранить (в вашем случае, строку XML-данных) в base64, используя библиотеку js, такую ​​как jquery-base64 от carlo . Затем поместите закодированную строку в ссылку и добавьте свою ссылку в DOM.

Пример использования библиотеки, которую я упомянул (а также jquery):

<html>
<head>
    <title>Example</title>
</head>
<body>
    <script>
        //include jquery and jquery-base64 here (or whatever library you want to use)
        document.write('<a href="data:application/octet-stream;base64;charset=utf-8,' + $.base64.encode( "this is a example, which requires the jquery-base64 library to work... replace this text with your xml" ) + '">click to make save dialog</a>');
    </script>
</body>
</html>

... и не забудьте сделать тип контента чем-то вроде application/octet-stream, чтобы браузер не пытался его открыть.

Предупреждение: некоторые более старые версии IE не поддерживают base64, но вы сказали, что это не имеет значения, поэтому это должно нормально работать для вас.

2 голосов
/ 19 февраля 2010

Без дополнительной информации о ваших конкретных требованиях я бы не стал рекомендовать чисто решение Javascript / HTML.С точки зрения пользователя, вы, вероятно, получите лучшие результаты при написании нативного приложения.Однако, если будет быстрее использовать Javascript / HTML, я рекомендую использовать локальное приложение с легковесным веб-сервером для обслуживания вашего контента.Таким образом, вы можете аккуратно обработать сохранение файла на стороне сервера, сосредоточив основную часть ваших усилий на внешнем приложении.

Вы можете кодировать веб-сервер, например, в Python или Ruby, используя очень мало строк кода и без сторонних библиотек.Например, см .:


"""
Serves files out of its current directory.
Doesn't handle POST requests.
"""
import SocketServer
import SimpleHTTPServer

PORT = 8080

def move():
    """ sample function to be called via a URL"""
    return 'hi'

class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        #Sample values in self for URL: http://localhost:8080/jsxmlrpc-0.3/
        #self.path  '/jsxmlrpc-0.3/'
        #self.raw_requestline   'GET /jsxmlrpc-0.3/ HTTP/1.1rn'
        #self.client_address    ('127.0.0.1', 3727)
        if self.path=='/move':
            #This URL will trigger our sample function and send what it returns back to the browser
            self.send_response(200)
            self.send_header('Content-type','text/html')
            self.end_headers()
            self.wfile.write(move()) #call sample function here
            return
        else:
            #serve files, and directory listings by following self.path from
            #current working directory
            SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)

httpd = SocketServer.ThreadingTCPServer(('localhost', PORT),CustomHandler)

print "serving at port", PORT
httpd.serve_forever()

Наконец - в зависимости от того, кто будет использовать ваше приложение, у вас также есть возможность скомпилировать программу Python в Frozen Binary , чтобы конечному пользователю не нужно было устанавливать Python на своем компьютере.

1 голос
/ 19 февраля 2010

Javascript не разрешен для записи на локальный компьютер. Ваш вопрос похож на этот .

Предлагаю создать простое настольное приложение.

0 голосов
/ 03 июня 2012

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

0 голосов
/ 20 февраля 2010

Один простой, но странный способ сделать это, не требующий Flash, - создать <a/> с URI данных для его href. Это даже имеет довольно хорошую межбраузерную поддержку, хотя для IE она должна быть не ниже версии 8, а URI должен быть <32k. Похоже, у кого-то еще на SO <a href="https://stackoverflow.com/questions/2088947/how-do-i-prompt-user-to-save-text-xml-to-a-file/2089049#2089049"> есть что сказать по теме.

0 голосов
/ 20 февраля 2010

С IE вы можете использовать document.execCommand, но я отмечаю, что IE не вариант.

Вот то, что выглядит так, как будто это может помочь, хотя в диалоговом окне Сохранить как это не будет отображаться, https://developer.mozilla.org/en/Code_snippets/File_I%2F%2FOL.

0 голосов
/ 19 февраля 2010

В порядке ли локальный PHP-сервер? Интернет традиционно не может быть сохранен на жесткий диск из-за проблем безопасности. PHP может отправлять файлы, хотя для этого требуется сервер.

Плагины для печати в PDF доступны для всех браузеров. Установите один раз, печатайте в PDF навсегда. Затем вы можете использовать javascript или Flash для вызова функции Print.

Кроме того, если вы разрабатываете для среды, где доступ к Интернету нечеткий, вы можете использовать VB.NET или другой язык рабочего стола.

РЕДАКТИРОВАТЬ:

Вы можете использовать функцию печати браузера.

0 голосов
/ 19 февраля 2010

Вы ищете что-то вроде этого ?

Если с PHP все в порядке, было бы намного проще.

...