Доступ к локальному файлу с помощью javascript

Есть ли локальная обработка файлов, которая была выполнена с помощью JavaScript? Я ищу решение, которое может быть выполнено без установки рабочего места, например AIR.

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

Ответ 1

Если пользователь выбирает файл через <input type="file">, вы можете читать и обрабатывать этот файл с помощью File API.

Чтение или запись произвольных файлов не допускается по дизайну. Это нарушение песочницы. Из Википедия → Javascript → Безопасность:

JavaScript и DOM предоставляют потенциал для злонамеренных авторов предоставлять скрипты для запуска на клиенте компьютер через Интернет. Авторы браузера содержат этот риск, используя два ограничения. Во-первых, скрипты запускаются в песочница, в которой они могут выполнять только действия, связанные с веб-сайтом, а не задачи общего назначения, такие как создание файлов.

2016 UPDATE. Доступ к файловой системе напрямую возможен через API файловой системы, который поддерживается только Chrome и Opera и может не реализоваться другими браузерами ( с исключение Edge). Подробнее см. ответ Кевина.

Ответ 2

Просто обновление функций HTML5 http://www.html5rocks.com/en/tutorials/file/dndfiles/ В этой замечательной статье будет объяснено подробное описание доступа к локальному файлу в Javascript. Резюме из указанной статьи:

Спецификация предоставляет несколько интерфейсов для доступа к файлам из локальной файловой системы:

  • Файл - отдельный файл; предоставляет информацию только для чтения, такую ​​как имя, размер файла, тип mimetype и ссылку на дескриптор файла.
  • FileList - массивная последовательность объектов File. (Подумайте <input type="file" multiple> или перетащите каталог файлов с рабочего стола).
  • Blob - Позволяет разрезать файл в байтовые диапазоны.

- Изменить -

См. комментарий Пола Д. Уэйта ниже

Ответ 3

UPDATE Эта функция удаляется с Firefox 17 (см. https://bugzilla.mozilla.org/show_bug.cgi?id=546848).


В Firefox вы (программист) можете сделать это из файла JavaScript:

netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");

и вам (пользователю браузера) будет предложено разрешить доступ. (для Firefox вам просто нужно делать это каждый раз при запуске браузера)

Если пользователь браузера является кем-то другим, он должен предоставить разрешение.

Ответ 4

Как уже упоминалось ранее, FileSystem и File https://stackoverflow.com/API, а также FileWriter, может использоваться для чтения и записи файлов из контекста вкладки/окна браузера на клиентскую машину.

Существует несколько вещей, относящихся к https://stackoverflow.com/API-интерфейсам FileSystem и FileWriter, о которых вам следует знать, некоторые из которых были упомянуты, но стоит повторить:

  • Реализации https://stackoverflow.com/API-интерфейсов в настоящее время существуют только в браузерах на основе хрома (Chrome и Opera)
  • Оба https://stackoverflow.com/API были сняты со стандартного трека W3C 24 апреля 2014 года и на данный момент являются собственностью
  • Удаление (теперь запатентованных) https://stackoverflow.com/API-интерфейсов от реализации браузеров в будущем - это возможность
  • песочница (расположение на диске, за пределами которого файлы не могут произвести никакого эффекта) используется для хранения файлов, созданных с помощью https://stackoverflow.com/API
  • Используется виртуальная файловая система (структура каталогов, которая необязательно существует на диске в той же форме, что и при доступе из браузера) представляет файлы, созданные с помощью https://stackoverflow.com/API

Вот простые примеры того, как https://stackoverflow.com/API используются, прямо или косвенно, в тандеме, чтобы делать такие вещи:

BakedGoods *

Записать файл:

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){}
});

Использование необработанных файлов, https://stackoverflow.com/API FileWriter и FileSystem

Записать файл:

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);

Хотя https://stackoverflow.com/API-интерфейсы FileSystem и FileWriter больше не соответствуют стандартным трекам, их использование может быть оправдано в некоторых случаях, на мой взгляд, потому что:

  • Возобновленный интерес у недействующих поставщиков браузеров может вернуть их обратно.
  • Проникновение на рынок реализующих (на основе хромовых) браузеров является высоким.
  • Google (основной вклад в Chromium) не дал и не закончил https://stackoverflow.com/API https://stackoverflow.com/API

Однако, если "некоторые случаи" охватывают ваши собственные, вы должны решить.

* BakedGoods поддерживается не кем иным, как этим парнем прямо здесь:)

Ответ 5

NW.js позволяет создавать настольные приложения с использованием Javascript без всех ограничений безопасности, обычно устанавливаемых в браузере. Таким образом, вы можете запускать исполняемые файлы с функцией или создавать/редактировать/читать/записывать/удалять файлы. Вы можете получить доступ к аппаратным средствам, таким как текущее использование процессора или общее количество оперативной памяти в использовании, и т.д.

С его помощью вы можете создать настольное приложение для Windows, Linux или Mac, которое не требует установки.

Вот структура для NW.js, универсального графического интерфейса:

Ответ 6

Если вы развертываете в Windows, Windows Script Host предлагает очень полезный JScript API для файловой системы и других локальных ресурсов, Однако включение сценариев WSH в локальное веб-приложение может быть не таким элегантным, как вы могли бы пожелать.

Ответ 7

Если у вас есть поле ввода, например

<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;
}

Ответ 8

FSO.js обертывает новый API-интерфейс HTML5 FileSystem, который стандартизован W3C и обеспечивает чрезвычайно простой способ чтения, записи, или пересечь локальную изолированную файловую систему. Он асинхронный, поэтому файл IO не будет мешать работе пользователя.:)

Ответ 9

Если вам нужен доступ ко всей файловой системе на клиенте, чтение/запись файлов, просмотр папок для изменений, запуск приложений, шифрование или подписывание документов и т.д., пожалуйста, посмотрите на JSFS.

Он позволяет безопасный и неограниченный доступ с вашей веб-страницы к ресурсам компьютера на клиенте, не используя технологию плагина браузера, такую ​​как AcitveX или Java Applet. Тем не менее, мир программного обеспечения также должен быть установлен.

Для работы с JSFS вы должны иметь базовые знания в разработке Java и Java EE (сервлеты).

Здесь вы найдете JSFS: https://github.com/jsfsproject/jsfs. Он бесплатный и лицензированный под лицензией GPL

Ответ 10

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

Основная идея решения: javascript не может получить доступ к файлу, указав его локальный URL. но он может использовать файл, имея его DataURL: поэтому, если пользователь просматривает файл и открывает его, js должен получить "DataURL" непосредственно из HTML вместо получения "URL".

Затем он превращает DataURL в файл, используя функцию readAsDataURL и объект FileReader. источник и более полное руководство с хорошим примером:

https://developer.mozilla.org/en-US/docs/Web/API/FileReader?redirectlocale=en-US&redirectslug=DOM%2FFileReader

Ответ 11

Существует (коммерческий) продукт, localFS, который можно использовать для чтения и записи всей файловой системы на клиентском компьютере.

Небольшое приложение для Windows должно быть установлено, а крошечный файл .js должен быть на вашей странице.

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

https://www.fathsoft.com/localfs

Ответ 12

если вы используете angularjs и aspnet/mvc, чтобы получить json файлы, вы должны разрешить тип mime в веб-конфигурации

<staticContent>
    <remove fileExtension=".json" />
    <mimeMap fileExtension=".json" mimeType="application/json" />
  </staticContent>