Создайте некоторый 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 кажутся лучшим кандидатом, учитывая сложность требований и доступное время. Тем не менее, у меня есть это единственное требование, чтобы иметь возможность сохранять данные, которые необходимо преодолеть, прежде чем я смогу выбрать эту линию развития.
Ответы
Ответ 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
Почему бы не использовать гибридную флешку для клиента и серверного решения на стороне сервера. У большинства пользователей есть флеш-память, поэтому вы можете по умолчанию на стороне клиента сохранять ресурсы на сервере.