Поиск по сайту:

Веб-приложения теперь могут взаимодействовать с вашей файловой системой


File System Access API — это новая функция браузера, которая позволяет веб-сайтам и приложениям напрямую взаимодействовать с файловой системой вашего устройства. Теперь есть частичная поддержка API в последних версиях Chrome и Opera.

То, что сейчас называется API доступа к файловой системе, раньше называлось Native File System API. У него была долгая разработка, включающая несколько итераций для решения проблем безопасности. Эта функция была включена в стабильной версии Chrome 86.

Обзор

Поддержка файлов в Интернете исторически ограничивалась выбором файла с вашего устройства с помощью

< input type="file">

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

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

Используя API, вы можете перечислять содержимое каталогов, считывать данные из файлов и выполнять обратную запись в новые и существующие файлы, хранящиеся на устройстве пользователя. Доступ предоставляется через объекты-дескрипторы FileSystemFileHandle и FileSystemDirectoryHandle, которые представляют файлы в системе пользователя.

API доступа к файловой системе можно использовать только со страниц, загружаемых через HTTPS. Он закрыт разрешениями, на которые пользователь должен дать явное согласие. Пользователю будет предложено предоставить согласие каждый раз, когда вы используете API. При этом используется та же система, что и при запросах разрешений для других веб-функций, таких как уведомления и доступ к камере.

Как и большинство современных API-интерфейсов JavaScript, доступ к файловой системе является асинхронным. Вызовы его поверхности API возвращают обещания. Самый простой способ использовать его — использовать синтаксис async/await ES7, который мы будем использовать в следующих примерах.

Чтение файла

Чтобы прочитать файл, вы открываете средство выбора файлов с помощью функции window.showOpenFilePicker(). Нет необходимости использовать HTML

< input type="file">

элемент.

Операционная система пользователя будет отображать собственное средство выбора файлов. Как только пользователь выберет файл, возвращаемый Promise будет разрешен с массивом объектов FileSystemFileHandle.

Чтобы получить содержимое файла, вызовите метод getFile() дескриптора файла. Это возвращает объект File, который вы получаете при работе со средством выбора файлов HTML. Когда у вас есть File, вы можете использовать его методы blob, такие как text() и stream(), для чтения его данных.

const [fileHandle] = await window.showOpenFilePicker();
const file = await file.getFile();
const fileData = await file.text();
console.log(fileData);

window.showOpenFilePicker() принимает объект параметров в качестве единственного параметра. Вы можете разрешить пользователю выбирать несколько файлов, установив параметр multiple. Чтобы ограничить пользователя определенными типами файлов, передайте параметр types с массивом объектов, описывающих разрешенные типы. Каждый объект типа должен содержать свойства description и accept, которые определяют метку средства выбора файла типа и допустимые типы MIME соответственно.

const files = await window.showOpenFilePicker({
    multiple: true,
    types: [
        {
            description: "Image Files",
            accept: ["image/jpeg", "image/png"]
        }
    ]
});
 
for await (file of files) {
    const fileData = await file.getFile();
    console.log(fileData);
}

Параметр «все файлы» обычно отображается как допустимый тип файла, даже если установлен параметр types. Вы можете отключить переопределение всех файлов, установив параметр excludeAcceptAllOption.

Запись в файл

Если у вас есть дескриптор файла, вы также можете писать в него! Есть еще один уровень абстракции, с которым нужно бороться, так как вы должны сначала получить FileSystemWritableFileStream. Этот поток представляет файл и позволяет вам сохранять записи в памяти до тех пор, пока они не будут сохранены на диске.

Вот как заменить содержимое дескриптора файла, полученного из showOpenFilePicker():

// User selects a file
const fileHandle = await window.showOpenFilePicker();
 
// Get a `FileSystemWritableFileStream` we can write to
const writableFileStream = await fileHandle.createWritable();
 
// Write new file contents into the stream
await writableFileStream.write("Hello World");
 
// Close the writable stream - its content is now persisted to the file on disk
await writableFileStream.close();

Вызов write() в доступном для записи потоке вставит текст в текущую позицию курсора в потоке. Чтобы изменить положение курсора, вызовите метод seek(), передав новое положение курсора. Третий метод для записываемых потоков — truncate(), который изменяет размер файла до максимального размера в байтах, который вы должны указать.

Иногда вам нужно будет записать в новый файл. Вы можете сделать это, попросив пользователя выбрать новое место для файла с помощью window.showSaveFilePicker(). Это работает аналогично window.showOpenFilePicker() — он возвращает FileHandle, который затем можно вызвать createWritable() для получения записываемый поток.

const fileHandle = await window.showSaveFilePicker();
const writable = await fileHandle.createWritable();
await writable.write("Hello World");
await writable.close();

Вы можете использовать параметры excludeAcceptAllOption и types с window.showSaveFilePicker(). Они работают так же, как их аналоги showOpenFilePicker().

Каталоги

API доступа к файловой системе также предоставляет доступ к каталогам. Пользователю может быть предложено выбрать каталог с помощью window.showDirectoryPicker(). Эта функция не принимает никаких параметров. Он возвращает обещание, которое разрешается с помощью FileSystemDirectoryHandle, представляющего каталог.

Вы можете перечислить содержимое каталога, перебирая его values(). Значения будут экземплярами дескриптора файла или каталога.

const directoryHandle = window.showDirectoryPicker();
for await (let handle of directoryHandle.values()) {
    if (handle.type === "file") {
        // file
    }
    if (handle.type === "directory") {
        // subdirectory
    }
}

Если вы знаете имя искомого файла или подкаталога, вы можете использовать методы getFileHandle() или getDirectoryHandle() для его извлечения. Оба этих метода принимают объект параметров, который в настоящее время имеет одно свойство create. Установка этого параметра в true приведет к тому, что запрошенный файл или каталог будут автоматически созданы в файловой системе, если он еще не существует.

Вы можете удалить файлы и папки из каталога, используя метод removeEntry() для дескриптора каталога. Это принимает относительное имя файла или подкаталога для удаления. При удалении каталога вы можете дополнительно установить параметр recursive, чтобы также удалить его содержимое.

await directoryHandle.removeEntry("file.txt");
await directoryHandle.removeEntry("Subdirectory", {recursive: true});

Разрешения

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

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

Вы можете проверить, есть ли у вас разрешение на использование дескриптора, вызвав его метод queryPermission():

const mode = "read";    // may also be "readwrite"
if (await fileHandle.queryPermission({mode}) === "granted") {
    // OK
}

Если вам нужно повторно запросить разрешение, используйте метод requestPermission() таким же образом.

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

API не предоставляет постоянных разрешений. Как только все вкладки вашего сайта будут закрыты, все предоставленные права доступа к файлам будут отозваны.

Заключение

API доступа к файловой системе — один из самых интересных API браузеров, запущенных за последние месяцы. Он может преобразовать возможности веб-приложений, сделав их еще более жизнеспособной альтернативой настольным программам.

Независимо от того, создаете ли вы текстовый редактор, фотогалерею или корпоративное бизнес-приложение, возможность взаимодействия с файловой системой устройства открывает перед вами новые возможности. Хотя в обозримом будущем поддержка браузеров будет ограничена Chrome и Opera (Mozilla рассматривает API как «потенциально очень опасный»), доступ к файловой системе помогает развивать Интернет как платформу приложений и еще больше сокращает разрыв между Интернетом и нативными приложениями.




Все права защищены. © Linux-Console.net • 2019-2024