Сохранение файла из строки JavaScript без попадания на сервер - PullRequest
2 голосов
/ 22 февраля 2011

Если у меня есть строка в JavaScript в памяти, скажем, в формате Excel или PDF, и я хочу открыть диалоговое окно сохранения, чтобы пользователь мог сохранить эти байты в файл, как мне поступить?Я стараюсь не возвращаться на сервер.Если я возвращаюсь на сервер, я могу отправить правильные заголовки HTTP в ответ, чтобы сообщить браузеру, что я отправляю файл.Но я хочу сделать это из JavaScript, потому что у меня уже есть байты, которые мне нужны на клиенте.

Возможно ли это?

Редактировать:
Я должен уточнить, что я на самом делеищу здесь.Я работаю с приложением Silverlight.Из Silverlight я могу открыть диалоговое окно сохранения и сохранить байты (в данном случае, скажем, это байты Excel).Похоже, это то, что люди предлагают ниже, когда они предлагают использовать Flash.Silverlight предоставляет те же функции.

Но я бы предпочел, чтобы файл Excel открывался только в новом окне браузера.Я мог бы сделать это довольно легко, если бы я генерировал файл на сервере, потому что я мог просто отправить правильные заголовки.Но у меня уже есть байты в Silverlight на клиенте.Есть ли способ открыть этот документ в новом окне браузера, чтобы пользователь мог просто нажать кнопку «Открыть», не выбрав место сохранения и не перейдя к файлу?

И я не могу использовать внеопция приложения браузера.Я знаю, что было бы возможно использовать это, разговаривая с Excel через COM-взаимодействие.Но в этом случае не стоит.

Но я могу взаимодействовать с JavaScript из Silverlight.Поэтому я надеялся, что смогу каким-то образом использовать JavaScript, чтобы открыть окно браузера и передать в него байты Excel.

Ответы [ 4 ]

4 голосов
/ 22 февраля 2011

Вы можете использовать URI данных для встраивания файла в документ HTML;например, http://jsfiddle.net/dqWae/ создает ссылку, которая инициирует загрузку титульного изображения Википедии.(Тип MIME жестко закодирован как application/octet-stream, но вы, конечно, можете указать его как PDF или XLS).

Вам необходимо будет закодировать байты файла как base 64 исоздать URI данных для ресурса.Затем создайте новый элемент привязки, атрибутом которого href является URI данных.Если вы хотите автоматически инициировать загрузку, программно отправляет событие щелчка на элемент привязки.

1 голос
/ 22 февраля 2011

В чистом javascript это будет возможно только с html5, но не сейчас.

, но вы можете создать некоторый мост javascript / flash 10, вы передаете байты Flash, который открывает диалог «сохранить как» итогда вы можете сэкономить 100% клиентской части.

Флэш-память может быть загружена динамически.

см. код здесь: http://sujitreddyg.wordpress.com/2008/11/04/filereference-in-flash-player-10/

1 голос
/ 22 февраля 2011

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

0 голосов
/ 22 февраля 2011

Существует одно не кросс-браузерное решение (работает только в Firefox и только когда пользователь предоставляет разрешения).

// ask for security grants
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");

var pngBinary = 'some string';

var aFile = Components.classes["@mozilla.org/file/local;1"].
            createInstance(Components.interfaces.nsILocalFile);
aFile.initWithPath( "/tmp/somefile.png" );
aFile.createUnique( Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 600);
var stream = Components.classes["@mozilla.org/network/safe-file-output-stream;1"].
             createInstance(Components.interfaces.nsIFileOutputStream);
stream.init(aFile, 0x04 | 0x08 | 0x20, 0600, 0);
stream.write(pngBinary, pngBinary.length);
if (stream instanceof Components.interfaces.nsISafeOutputStream) {
    stream.finish();
} else {
    stream.close();
}

Но я рекомендую вам сделать кросс-браузерные приложения и выбрать Flash-решение.

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