В последнее время я возился с WebGL и заставил работать читателя Collada. Проблема в том, что он довольно медленный (Collada - очень многословный формат), поэтому я собираюсь начать преобразование файлов в более простой формат (возможно, JSON). У меня уже есть код для синтаксического анализа файла в JavaScript, поэтому я могу также использовать его как мой экспортер! Проблема в сохранении.
Теперь я знаю, что могу проанализировать файл, отправить результат на сервер и сделать так, чтобы браузер запросил файл с сервера для загрузки. Но на самом деле сервер не имеет ничего общего с этим конкретным процессом, так зачем его привлекать? У меня уже есть содержимое нужного файла в памяти. Можно ли как-то представить пользователю загрузку с использованием чистого JavaScript? (Я сомневаюсь в этом, но с таким же успехом могу спросить ...)
И чтобы быть ясным: я не пытаюсь получить доступ к файловой системе без ведома пользователей! Пользователь предоставит файл (возможно, с помощью перетаскивания), скрипт преобразует файл в памяти, и пользователю будет предложено загрузить результат. Все это должно быть «безопасной» деятельностью, если речь идет о браузере.
[РЕДАКТИРОВАТЬ]: Я не упомянул об этом заранее, поэтому постеры, которые ответили «Flash», достаточно действительны, но часть того, что я делаю, - это попытка подчеркнуть, что можно сделать с чистым HTML5 ... так что Flash это прямо в моем случае. (Хотя это совершенно правильный ответ для любого, кто делает «настоящее» веб-приложение.) В таком случае мне кажется, что мне не повезло, если я не хочу привлекать сервер. Спасибо, в любом случае!
источник
Ответы:
Хорошо, создание данных: URI определенно помогает мне, благодаря Мэтью и Деннкстеру, указавшим эту возможность! Вот как я это делаю:
1) получить весь контент в строку с именем «content» (например, создав его там изначально или прочитав innerHTML тега уже созданной страницы).
2) Создайте URI данных:
Будут ограничения по длине в зависимости от типа браузера и т. Д., Но, например, Firefox 3.6.12 работает по крайней мере до 256 КБ. Кодирование в Base64 вместо использования encodeURIComponent может сделать вещи более эффективными, но для меня это было нормально.
3) откройте новое окно и «перенаправьте» его на этот URI, запрашивая местоположение загрузки моей страницы, созданной JavaScript:
Вот и все.
источник
location.href
содержимое.location.href = uriContent
,location.href = "data:application/octet-stream," + encodeURIComponent(jQuery('#answer-4551467 .post-text').first().text());
и она сохранит содержимое ответа @ Nøk в файл. У меня нет IE, чтобы проверить его, но он работает для webkit.Простое решение для HTML5 готовых браузеров ...
использование
источник
HTML5 определяет
window.saveAs(blob, filename)
метод. Это не поддерживается ни одним браузером сейчас. Но есть библиотека совместимости под названием FileSaver.js, которая добавляет эту функцию в большинство современных браузеров (включая Internet Explorer 10+). Internet Explorer 10 поддерживаетnavigator.msSaveBlob(blob, filename)
метод ( MSDN ), который используется в FileSaver.js для поддержки Internet Explorer.Я написал сообщение в блоге с более подробной информацией об этой проблеме.
источник
Сохранение больших файлов
Длинные URI данных могут вызвать проблемы с производительностью в браузерах. Другой вариант сохранения сгенерированных на стороне клиента файлов - поместить их содержимое в объект Blob (или файл) и создать ссылку для загрузки с помощью
URL.createObjectURL(blob)
. Это возвращает URL, который можно использовать для получения содержимого большого двоичного объекта. BLOB-объект хранится в браузере до тех пор, пока неURL.revokeObjectURL()
будет вызван URL-адрес или документ, который его создал, закрыт. Большинство веб-браузеров поддерживают URL-адреса объектов , Opera Mini - единственный, который их не поддерживает.Принудительное скачивание
Если данные представляют собой текст или изображение, браузер может открыть файл, а не сохранять его на диск. Чтобы файл был загружен при нажатии на ссылку, вы можете использовать
download
атрибут. Однако не все веб-браузеры поддерживают атрибут загрузки . Другим вариантом является использованиеapplication/octet-stream
в качестве mime-типа файла, но это приводит к тому, что файл представляется в виде двоичного двоичного объекта, что особенно неудобно для пользователя, если вы не указали имя файла или не можете его указать. См. Также « Принудительно открывать всплывающее окно« Сохранить как ... »при открытии текстовой ссылки, нажмите pdf в HTML »Указание имени файла
Если BLOB-объект создается с помощью конструктора файлов, вы также можете задать имя файла, но только несколько веб-браузеров (включая Chrome и Firefox) поддерживают конструктор файлов . Имя файла также может быть указано в качестве аргумента
download
атрибута, но это зависит от тонны соображений безопасности . Internet Explorer 10 и 11 предоставляет собственный метод msSaveBlob для указания имени файла.Пример кода
источник
msSaveBlob
открыть диалоговое окно «Сохранить как». Для других браузеров единственный вариант - вручную выбрать «Сохранить как» в контекстном меню ссылки для скачивания.document.getElementById('link').href = url;
ваш код может пойти дальше и запустить ссылку, используя метод элемента.click()
.источник
a.click
код, используя,document.createEvent()
как предложил Матей Покорны, он работает на FF, но не на IE. Я не пробовал Chrome.Взгляните на Doug Neiner's Downloadify, который является JavaScript-интерфейсом на основе Flash для этого.
источник
HTML 5
баннером и пометить соответственно? Это, вероятно, привлечет тех пользователей, которые знают об этой конкретной области (я полагаю, все еще сравнительно небольшая толпа сейчас). Я уверен, что это можно сделать в HTML 5, но я понятия не имею, как.Простое решение!
Работает во всех современных браузерах.
источник
window.open()
. Это не имеет значения. Вы можете использовать этот метод и принудительно использовать a.click()
, но смотрите время, так как Firefox не понравится, если вы позвоните,.click()
прежде чем позволить элементу присоединиться к телу.Вы можете сгенерировать URI данных . Тем не менее, существуют ограничения для браузера.
источник
"data:text/plain;charset=UTF-8,"+encodeURIComponent(text)
но да, IE ограничивает размер URL-адресов данных до неиспользуемой суммы и не поддерживает их для таких вещей, какwindow.open(...)
или фреймы (я думаю).Я использовал FileSaver ( https://github.com/eligrey/FileSaver.js ), и он отлично работает.
Например, я сделал эту функцию для экспорта журналов, отображаемых на странице.
Вы должны передать массив для создания экземпляра BLOB-объекта, так что я просто, возможно, не написал это правильно, но это работает для меня.
На всякий случай, будьте осторожны с заменой: это синтаксис, чтобы сделать этот глобальный, иначе он заменит только первый, который он встретит.
источник
w.close();
послеexecCommand
Я нашел два простых подхода, которые работают для меня. Во-первых, используя уже выбранный
a
элемент и добавляя данные для загрузки. И, во-вторых, созданиеa
элемента с данными загрузки, выполнениеa.click()
и удаление его снова. Но второй подход работает только в том случае, если он вызывается действием пользователя. (Некоторые) Блокировка браузераclick()
из других контекстов, например, при загрузке или срабатывание после тайм-аута (setTimeout).источник
a
в документ (возможно, с помощью"display:none"
), щелкнуть по нему, а затем удалить его.Вот ссылка на метод URI данных, предложенный Мэтью, он работал на сафари, но не очень хорошо, потому что я не мог установить тип файла, он сохраняется как «неизвестный», а затем мне нужно вернуться туда позже и изменить его по порядку. просмотреть файл ...
http://www.nihilogic.dk/labs/canvas2image/
источник
Вы можете использовать localStorage. Это HTML5-эквивалент файлов cookie. Похоже, что работает на Chrome и Firefox НО на Firefox, мне нужно было загрузить его на сервер. То есть тестирование непосредственно на моем домашнем компьютере не сработало.
Я работаю над примерами HTML5. Перейдите по адресу http://faculty.purchase.edu/jeanine.meyer/html5/html5explain.html и перейдите к лабиринту. Информация для восстановления лабиринта хранится с использованием localStorage.
Я пришел к этой статье в поисках HTML5 JavaScript для загрузки и работы с XML-файлами. Это так же, как старые HTML и JavaScript ????
источник
пытаться
Если вы хотите скачать двоичные данные, посмотрите здесь
Обновить
2020.06.14 Я обновляю Chrome до 83.0 и выше, так что остановка фрагмента работает (из-за ограничений безопасности песочницы ) - но версия JSFiddle работает - здесь
источник
Как упоминалось ранее, File API вместе с FileWriter и FileSystem API-интерфейсами можно использовать для хранения файлов на клиентском компьютере из контекста вкладки / окна браузера.
Однако есть несколько вещей, относящихся к последним двум API, о которых вы должны знать:
Вот простые примеры того, как API, прямо и косвенно, используются для этого:
BakedGoods *
Использование сырых API File, FileWriter и FileSystem
Хотя API FileSystem и FileWriter более не соответствуют стандартам, их использование в некоторых случаях может быть оправдано, на мой взгляд, потому что:
Однако, «некоторые случаи» охватывают ваши собственные, решать вам.
* BakedGoods поддерживается только этим парнем прямо здесь :)
источник
Этот поток был неоценим, чтобы выяснить, как сгенерировать двоичный файл и предложить загрузить указанный файл, все в коде клиента без сервера.
Первым шагом для меня было создание двоичного двоичного объекта из данных, которые я сохранял. Существует множество примеров для выполнения этого для одного двоичного типа, в моем случае у меня есть двоичный формат с несколькими типами, который вы можете передать в виде массива для создания большого двоичного объекта.
Следующий шаг - заставить браузер предложить пользователю загрузить этот BLOB-объект с заранее заданным именем.
Все, что мне было нужно, это именованная ссылка, которую я добавил в HTML5, и которую я мог использовать повторно, чтобы переименовать исходное имя файла. Я скрыл это, так как ссылка не нуждается в отображении.
Последний шаг - предложить пользователю загрузить файл.
источник
Вот учебник для экспорта файлов в формате ZIP:
Прежде чем начать, есть библиотека для сохранения файлов, имя библиотеки fileSaver.js, вы можете найти эту библиотеку здесь. Давайте начнем, Теперь, включите необходимые библиотеки:
Теперь скопируйте этот код, и этот код загрузит zip-файл с файлом hello.txt, имеющим содержимое Hello World. Если все работает нормально, файл загрузится.
Это загрузит файл с именем file.zip. Вы можете прочитать больше здесь: http://www.wapgee.com/story/248/guide-to-create-zip-files-using-javascript-by-using-jszip-library
источник