Позволяет ли HTML5 взаимодействовать с локальными файлами клиента из браузера? - PullRequest
31 голосов
/ 04 марта 2010

Я видел некоторые сообщения о доступе к файлам на клиентском компьютере через веб-страницу, а именно этот вопрос .

Я пытаюсь использовать парадигму «непрерывного обновления в облаке» для некоторых написанных мной алгоритмов, чтобы мои пользователи могли получить доступ к последним версиям, просто зайдя на веб-страницу.Это требует, чтобы программа / веб-страница могла начинаться с каталога и рекурсивно проверять файлы внутри него и вычислять результаты на основе найденного.В конце концов он также сможет записать файл результатов в файловую систему клиента.

В одном из ответов на предыдущий вопрос упоминается Google Gears, но с тех пор он был прекращен в пользу HTML5.Возможен ли доступ к клиентскому каталогу в HTML5?Как?

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

Ответы [ 3 ]

30 голосов
/ 04 марта 2010

Нет, не напрямую, по крайней мере. Тем не менее, у вас есть несколько вариантов здесь.

На данный момент ваш лучший выбор:

  • Перетаскивание файлов с рабочего стола, см. учебник .
  • Использовать тип файла ввода.
    • Прочитать содержимое с помощью File API или отправить форму. Подробнее о Центре разработчиков Mozilla о динамическом чтении файла.
    • Вы можете указать атрибут multiple для чтения и открытия нескольких файлов одновременно без необходимости иметь отдельные поля.
    • Вы можете иметь невидимый ввод и «вызвать щелчок» на нем, чтобы открыть диалоговое окно открытия файла. Для получения дополнительной информации см. Предыдущую ссылку на Центр разработчиков Mozilla.
  • Используйте FileSystem API , который позволяет создавать, удалять, читать, изменять файлы в файловой системе. Примечание: вы получаете изолированную директорию для работы, вы не можете получить доступ ко всей системе просто так.
  • Используйте Java с подписанными апплетами для доступа ко всей файловой системе. Для этого пользователю необходимо принять подпись.
2 голосов
/ 17 июля 2010

Chrome 6 также будет поддерживать File API

0 голосов
/ 07 июля 2016

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

Есть несколько вещей, относящихся к API-интерфейсам FileSystem и FileWriter, о которых вы должны знать, некоторые из которых были упомянуты, но стоит повторить:

  • Реализации API в настоящее время существуют только в браузерах на основе Chromium (Chrome & Opera)
  • Оба API были сняты со стандартного трека W3C 24 апреля 2014 года и на данный момент являются собственностью
  • Возможность удаления (в настоящее время проприетарных) API-интерфейсов из реализации браузеров в будущем возможна
  • A песочница (место на диске, вне которого файлы не могут оказать никакого эффекта) используется для хранения файлов, созданных с помощью API
  • виртуальная файловая система (структура каталогов, которая не обязательно существует на диске в той же форме, что и при доступе из браузера), представляет файлы, созданные с помощью API

Вот простые примеры того, как 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){}
});

Использование необработанных API-интерфейсов File, 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);

Учитывая текущие статусы API-интерфейсов FileSystem и FileWriter, их использование для чтения и записи файлов в настоящее время не представляет собой «способ HTML5» для выполнения этих задач.

Возобновление интереса к API со стороны не реализующих поставщиков браузеров, однако, может вернуть их обратно в русло стандартов. Это в сочетании с высоким уровнем проникновения на рынок браузеров на основе Chromium и тем фактом, что Google (основной поставщик Chromium) не предоставил API-интерфейс и срок его службы должен быть достаточным, чтобы оправдать их использование в некоторых случаях.

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

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