Подтвердить что ты не робот

Создайте некоторый xml в javascript, предложите пользователю сохранить его

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

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

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

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

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

4b9b3361

Ответ 1

Как насчет этого downloadify script?

На основе 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
});

Ответ 2

Используя 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, но вы сказали, что это не имеет значения, так что это должно сработать для вас.

Ответ 3

Без более подробного описания ваших конкретных требований я бы не рекомендовал чистое решение 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 на своей машине.

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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

ИЗМЕНИТЬ:

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

Ответ 7

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

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

Ответ 8

Один простой, но нечетный способ сделать это, для которого не требуется Flash, - создать <a/> с URI данных для его href. Это даже очень хорошая поддержка кросс-браузера, хотя для IE она должна быть, по крайней мере, версии 8, и URI должен быть < 32k. Похоже, что кто-то еще на SO может больше сказать по теме.

Ответ 9

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