Локальный доступ к файлам с помощью javascript
есть ли какие-либо локальные манипуляции с файлами, которые были сделаны с помощью JavaScript? Я ищу решение, которое можно выполнить без установки следа, например, требующего воздуха.
в частности, я хотел бы прочитать содержимое из файла и запись содержимого в другой файл. На данный момент я не беспокоюсь о получении разрешений, просто предполагая, что у меня уже есть полные разрешения на эти файлы.
11 ответов:
если пользователь выбирает файл через
<input type="file">вы можете читать и Кевин.
просто обновление функций HTML5http://www.html5rocks.com/en/tutorials/file/dndfiles/ в этой превосходной статье будет подробно описан локальный доступ к файлам в Javascript. Резюме из упомянутой статьи:
спецификация предоставляет несколько интерфейсов для доступ к файлам из "локальной" файловой системы:
- файл-отдельный файл; предоставляет информацию только для чтения, такую как имя, размер файла, тип mimetype и ссылку на дескриптор файла.
- список - массив как последовательность объектов файл. (Подумай
<input type="file" multiple>или перетаскивание каталога файлов с рабочего стола).- Blob-позволяет нарезать файл на байтовые диапазоны.
-- Edit --
см. комментарий Пола Д. Уэйта ниже
обновление эта функция удаляется с Firefox 17 (см. https://bugzilla.mozilla.org/show_bug.cgi?id=546848).
в Firefox вы (программист) можете сделать это из файла JavaScript:
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");и вам (пользователю браузера) будет предложено разрешить доступ. (для Firefox вам просто нужно сделать это один раз при каждом запуске браузера)
если пользователь браузера кто-то другой, они должны предоставить разрешение.
как уже упоминалось ранее,файловой системы и File API, вместе с FileWriter API, может использоваться для чтения и записи файлов из контекста вкладки/окна браузера на клиентскую машину.
есть несколько вещей, относящихся к файловой системе и API FileWriter, о которых вы должны знать, некоторые из которых были упомянуты, но стоит повторить:
- в настоящее время существуют только реализации API в браузерах на основе хрома (Chrome & Opera)
- оба API были сняты с трека стандартов W3C 24 апреля 2014 года и на данный момент являются собственностью
- удаление (Теперь проприетарных) API из реализации браузеров в будущем-это возможность
- A песочница (расположение на диске, вне которого файлы не могут производить никакого эффекта) используется для хранения файлов, созданных с помощью API
- A виртуальный файл система (структура каталогов, которая не обязательно существует на диске в той же форме, что и при доступе из браузера) используется для представления файлов, созданных с помощью API
вот простые примеры того, как API используются, прямо и косвенно, в тандеме, чтобы сделать эти вещи:
файл пишем:
bakedGoods.set({ data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}], storageTypes: ["fileSystem"], options: {fileSystem:{storageType: Window.PERSISTENT}}, complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){} });читать файл:
bakedGoods.get({ data: ["testFile"], storageTypes: ["fileSystem"], options: {fileSystem:{storageType: Window.PERSISTENT}}, complete: function(resultDataObj, byStorageTypeErrorObj){} });использование raw-файлов, FileWriter и API файловой системы
файл пишем:
function onQuotaRequestSuccess(grantedQuota) { function saveFile(directoryEntry) { function createFileWriter(fileEntry) { function write(fileWriter) { var dataBlob = new Blob(["Hello world!"], {type: "text/plain"}); fileWriter.write(dataBlob); } fileEntry.createWriter(write); } directoryEntry.getFile( "testFile", {create: true, exclusive: true}, createFileWriter ); } requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile); } var desiredQuota = 1024 * 1024 * 1024; var quotaManagementObj = navigator.webkitPersistentStorage; quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);читать файл:
function onQuotaRequestSuccess(grantedQuota) { function getfile(directoryEntry) { function readFile(fileEntry) { function read(file) { var fileReader = new FileReader(); fileReader.onload = function(){var fileData = fileReader.result}; fileReader.readAsText(file); } fileEntry.file(read); } directoryEntry.getFile( "testFile", {create: false}, readFile ); } requestFileSystem(Window.PERSISTENT, grantedQuota, getFile); } var desiredQuota = 1024 * 1024 * 1024; var quotaManagementObj = navigator.webkitPersistentStorage; quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);хотя API FileSystem и FileWriter больше не находятся на треке стандартов, их использование может быть оправдано в некоторых случаях, на мой взгляд, потому что:
- возобновленный интерес со стороны поставщиков браузера ООН-реализации может поместить их обратно на него
- рынок проникновение реализации (на основе хрома) браузеров является высоким
- Google (основной вклад в Chromium) не дал и дату окончания срока службы API
однако, охватывает ли "некоторые случаи" ваши собственные, вам решать.
*BakedGoods поддерживается не кем иным, как этим парнем прямо здесь:)
NW.js позволяет создавать настольные приложения с помощью Javascript без всех ограничений безопасности, обычно размещаемых в браузере. Таким образом, вы можете запускать исполняемые файлы с функцией или создавать/редактировать/читать/писать/удалять файлы. Вы можете получить доступ к аппаратным средствам, таким как текущая загрузка ЦП или общий объем используемой оперативной памяти и т. д.
вы можете создать Windows, linux или Mac desktop application с ним, который не требует каких-либо установка.
вот структура для NW.js, универсальный графический интерфейс:
Если вы разрабатываете на Windows Windows Script Host предлагает очень полезный JScript API для файловой системы и других локальных ресурсов. Однако включение сценариев WSH в локальное веб-приложение может быть не таким элегантным, как вам хотелось бы.
ФСО.js обертывает новый API файловой системы HTML5, который стандартизирован W3C и предоставляет очень просто способ чтения, записи или обхода локальной изолированной файловой системы. Это асинхронно, поэтому файл IO не будет мешать работе пользователя. :)
Если у вас есть поле ввода типа
<input type="file" id="file" name="file" onchange="add(event)"/>вы можете получить содержимое файла в формате BLOB:
function add(event){ var userFile = document.getElementById('file'); userFile.src = URL.createObjectURL(event.target.files[0]); var data = userFile.src; }
Если вам нужен доступ ко всей файловой системе на клиенте, чтение / запись файлов, просмотр папок для изменений, запуск приложений, шифрование или подписание документов и т. д. пожалуйста, взгляните на JSFS.
Это позволяет безопасный и неограниченный доступ с веб-страницы к ресурсам компьютера на клиенте без использования технологии плагина браузера, как AcitveX или Java апплет. Тем не менее, мир программного обеспечения также должен быть установлен.
для работы с JSFS у вас должен быть базовый знания в области разработки Java и Java EE (сервлеты).
пожалуйста, найдите JSFS здесь:https://github.com/jsfsproject/jsfs. это бесплатно и лицензировано под GPL
предполагая, что любой файл, который может понадобиться js, должен быть разрешен непосредственно пользователем, создатели известных браузеров не позволяют javascript обращаться к файлам вообще.
основная идея решения: javascript не может получить доступ к файлу, имея его локальный URL. но он может использовать файл, имея его DataURL: поэтому, если пользователь просматривает файл и открывает его, js должен получить "DataURL" непосредственно из HTML вместо получения "URL".
затем он превращает DataURL в файл, использование функции readAsDataURL и объекта FileReader. источник и более полное руководство с хорошим примером:
Если вы используете angularjs & aspnet/mvc, чтобы получить файлы json, вы должны разрешить тип mime в web config
<staticContent> <remove fileExtension=".json" /> <mimeMap fileExtension=".json" mimeType="application/json" /> </staticContent>
Comments