Содержание

Working with non-code files — GitHub Enterprise Cloud Docs

Отрисовка изображений и поиск различий

GitHub Enterprise Cloud отображает популярные форматы изображений, включая PNG, JPG, GIF, PSD и SVG. Помимо простого отображения, существует несколько способов сравнения различий в версиях этих форматов изображений.

Примечание.

  • GitHub не поддерживает сравнение различий между PSD-файлами.
  • Если вы используете браузер Firefox, SVG на GitHub может не отрисовываться.

Просмотр изображений

Вы можете напрямую просматривать изображения в репозитории в GitHub.com:

В настоящее время SVG не поддерживают встроенные скрипты и анимацию.

Просмотр различий

Вы можете визуально сравнивать изображения в трех разных режимах: 2-up, swipe и onion skin.

2-up

2-up — это режим по умолчанию, в котором вы смотрите на оба изображения. Кроме того, если в сравниваемых версиях у изображения разные размеры, отображается фактическое изменение размера. Это удобный способ для сравнения объектов разного размера, например при повышении разрешения.

Swipe

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

Onion skin

Режим Onion skin пригодится в ситуациях, когда элементы перемещаются на едва заметное расстояние. Например, значок сместился на два пикселя влево. Перетащите ползунок прозрачности немного назад и посмотрите, как сместились элементы.

Средство просмотра трехмерных файлов

GitHub Enterprise Cloud может размещать и отрисовывать трехмерные файлы с расширением STL.

Если вы напрямую просматриваете STL-файл в GitHub Enterprise Cloud, вы можете:

  • Поворачивать модель с помощью перетаскивания, щелкнув левой кнопкой мыши.
  • Преобразовывать представление с помощью перетаскивания, щелкнув правой кнопкой мыши.
  • Увеличивать и уменьшать масштаб с помощью колесика мыши.
  • Изменять представление, выбирая разные режимы.

Различия

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

По умолчанию вы получите представление, в котором все элементы без изменений будут показаны контурно. Дополнения окрашены зеленым цветом, а удаленные части — красным.

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

Решение проблемы низкой производительности

Если этот значок отображается в углу средства просмотра, технология WebGL недоступна в браузере:

WebGL позволяет использовать все преимущества аппаратного обеспечения вашего компьютера. Мы рекомендуем попробовать такие браузеры, как Chrome или Firefox, которые поставляются с включенным WebGL.

Ошибка: «Не удается отобразить»

Если модель недопустима, GitHub может не отображать файл. Кроме того, GitHub не может отображать файлы больше 10 МБ.

Внедрение модели в другое место

Чтобы отобразить трехмерный файл в другом месте в Интернете, измените этот шаблон и поместите его на любую HTML-страницу, поддерживающую JavaScript:

<script src="https://embed.github.com/view/3d/<username>/<repo>/<ref>/<path_to_file>"></script>

Например, если URL-адрес модели github.com/skalnik/secret-bear-clip/blob/master/stl/clip.stl, код внедрения будет следующим:

<script src="https://embed.github.com/view/3d/skalnik/secret-bear-clip/master/stl/clip.stl"></script>

По умолчанию внедренный отрисовщик имеет ширину 420 пикселей на 620 пикселей, но вы можете настроить выходные данные, передав переменные высоты и ширины в качестве параметров в конце URL-адреса, например

?height=300&width=500.

Примечание. ref может быть ветвью или хэшем для отдельной фиксации (например2391ae).

Отрисовка в разметке Markdown

Синтаксис STL ASCII можно внедрить непосредственно в Markdown. Дополнительные сведения см. в разделе Creating diagrams.

Отрисовка данных CSV и TSV

GitHub поддерживает отрисовку табличных данных в виде CSV— и TSV-файлов.

При просмотре любой.csv или TSV-файл , зафиксированный в репозитории в GitHub.com автоматически отображается в виде интерактивной таблицы с заголовками и нумеровкой строк. По умолчанию мы всегда предполагаем, что первая строка является строкой заголовка.

Вы можете выполнить привязку к определенной строке, щелкнув номер строки или выбрав несколько строк, удерживая клавишу SHIFT. Просто скопируйте URL-адрес и отправьте его другу.

Поиск данных

Если вы хотите найти определенное значение в наборе данных, можно начать вводить текст в строке поиска непосредственно над файлом. Строки будут фильтроваться автоматически:

Обработка ошибок

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

Ниже перечислены распространенные ошибки.

  • Несовпадение количества столбцов. В каждой строке должно быть одинаковое количество разделителей, даже если ячейка пуста
  • Превышение размера файла. Отрисовка работает только для файлов размером до 512 КБ. Более крупные файлы замедляют браузер.

Отрисовка PDF-документов

GitHub поддерживает отрисовку PDF-документов.

В настоящее время ссылки в PDF-файлах игнорируются.

Отрисовка различий в текстовых документах

Фиксации и запросы на вытягивание, включающие текстовые документы, могут представлять эти документы с исходным и отрисованным представлениями.

В исходном представлении отображается введенный необработанный текст, в то время как отрисованное представление показывает, как этот текст будет выглядеть после отрисовки на GitHub Enterprise Cloud. Например, это может быть разница между отображением

**bold** в Markdown и полужирным шрифтом в отрисованном представлении.

Отрисовка текста поддерживается для отрисованных документов, поддерживаемых github/markup:

  • Markdown
  • AsciiDoc
  • Textile
  • ReStructuredText
  • Rdoc
  • Организатор
  • Creole
  • MediaWiki
  • Pod

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

Отключение отрисовки Markdown

При просмотре файла Markdown можно щелкнуть в верхней части файла, чтобы отключить обработку файлов Markdown и просмотреть источник файла.

Отключение обработки файлов Markdown позволяет использовать функции просмотра источника, такие как связывание строк, что невозможно при просмотре обработанных файлов Markdown.

Визуализация изменений атрибутов

Мы предоставляем подсказку, описывающую изменения атрибутов, которые не были бы видны в отрисованном документе. Например, если URL-адрес ссылки меняется с одного веб-сайта на другой, мы отобразим подсказку следующим образом:

Комментарии к фиксациям можно добавлять только в файлы в исходном представлении построчно.

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

Просмотр сложных различий

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

Вы по-прежнему можете использовать исходное представление для анализа и комментирования изменений.

Просмотр HTML-элементов

Мы не поддерживаем напрямую отрисованные представления фиксаций в HTML-документах. Некоторые форматы, такие как Markdown, позволяют внедрять произвольный HTML-код в документ. Если эти документы отображаются на GitHub Enterprise Cloud, некоторые из внедренных HTML могут отображаться в предварительном просмотре, а некоторые (например, внедренное видео YouTube) не могут.

Как правило, отрисованные представления изменений документа, содержащего внедренный HTML, будут отображать изменения элементов, поддерживаемых в представлении GitHub Enterprise Cloudдокумента. Изменения в документах, содержащих внедренный HTML, всегда следует проверять как в представлениях отрисовки, так и в исходных представлениях для полноты.

Сопоставление файлов GeoJSON/TopoJSON на GitHub

GitHub Enterprise Cloud поддерживает отрисовку файлов карты GeoJSON и TopoJSON в репозиториях GitHub Enterprise Cloud. Просто зафиксируйте файл, как обычно, используя расширение .geojson или .topojson. Файлы с расширением .json также поддерживаются, но только в том случае, если для type задано значение FeatureCollection, GeometryCollectionили topology. Затем перейдите по пути к файлу GeoJSON/TopoJSON на сайте GitHub.com.

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

Тип геометрического объекта

Карты в GitHub Enterprise Cloud используют Leaflet.js и поддерживают все геометрические типы, описанные в спецификации geoJSON (Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon и GeometryCollection). Файлы TopoJSON должны иметь тип Topology и соответствовать спецификации TopoJSON.

Внедрение карты в другое место

Хотите, чтобы карта GeoJSON была доступна в другом месте, не только на GitHub Enterprise Cloud? Просто измените этот шаблон и поместите его на любую HTML-страницу, поддерживающую JavaScript (например, GitHub Pages):

<script src="https://embed.github.com/view/geojson/<username>/<repo>/<ref>/<path_to_file>"></script>

Например, если URL-адрес карты — github.com/benbalter/dc-wifi-social/blob/master/bars.geojson, код внедрения будет следующим:

<script src="https://embed.github.com/view/geojson/benbalter/dc-wifi-social/master/bars.geojson"></script>

По умолчанию внедренная карта имеет размер 420 x 620 пикселей, но вы можете настроить выходные данные, передав переменные высоты и ширины в качестве параметров в конце URL-адреса, например

?height=300&width=500.

Примечание. ref может быть ветвью или хэшем для отдельной фиксации (например2391ae).

Карты в Markdown

Вы можете внедрить GeoJSON и TopoJSON непосредственно в Markdown. Дополнительные сведения см. в разделе Creating diagrams.

Кластеризация

Если карта содержит большое количество маркеров (более 750), GitHub автоматически кластеризует ближайшие маркеры при малом приближении. Просто щелкните кластер или увеличьте масштаб, чтобы просмотреть отдельные маркеры.

Изменения базовой карты

Данные базовой карты (названия улиц, дороги и т. д.) управляются OpenStreetMap, совместным проектом по созданию бесплатной редактируемой карты мира. Если вы заметили ошибку, просто зарегистрируйтесь и отправьте исправление, ведь это проект с открытым кодом.

Устранение неполадок с файлами GeoJSON/TopoJSON

Если у вас возникли проблемы с отрисовкой файлов GeoJSON, убедитесь, что у вас есть действительный файл GeoJSON, запустив его с помощью анализатора кода GeoJSON. Если точки не отображаются там, где вы ожидаете (например, в середине океана), скорее всего, данные находятся в проекции, которая в настоящее время не поддерживается. В настоящее время GitHub Enterprise Cloud поддерживает только проекцию urn:ogc:def:crs:OGC:1.3:CRS84.

Кроме того, если размер файла .geojson особенно велик (более 10 МБ), его невозможно отрисовать в браузере. В этом случае вы увидите примерно следующее сообщение:

Возможно, данные по-прежнему можно отрисовать, преобразовав файл .geojson в TopoJSON, формат сжатия, который в некоторых случаях может уменьшить размер файлов до 80 %. Конечно, вы всегда можете разбить файл на небольшие блоки (например, по состоянию или по годам) и хранить данные в репозитории виде нескольких файлов.

Дополнительные сведения о GeoJSON/TopoJSON

  • Документация по Azure Maps
  • Вики-сайт TopoJSON

Работа с файлами Jupyter Notebook в GitHub

При добавлении файлов Jupyter Notebook или IPython Notebook с расширением IPYNB в GitHub. com они будут отображаться в виде статических HTML-файлов в репозитории.

Интерактивные функции записной книжки, такие как пользовательские графики JavaScript, не будут работать в репозитории в GitHub.com. Пример см. в разделе Связывание и Interactions.ipynb.

Чтобы просмотреть записную книжку Jupyter с отрисованным содержимым JavaScript или поделиться файлами записной книжки с другими пользователями, можно использовать nbviewer. Пример см. в файле Связывание Interactions.ipynb, отрисованном в nbviewer.

Чтобы просмотреть полностью интерактивную версию Jupyter Notebook, можно настроить сервер записной книжки локально. Дополнительные сведения см. в официальной документации по Jupyter.

Устранение неполадок с файлами Jupyter Notebook

Если у вас возникли проблемы с отрисовкой файлов Jupyter Notebook в статическом HTML-коде, вы можете преобразовать файл локально в командной строке с помощью команды nbconvert:

$ jupyter nbconvert --to html NOTEBOOK-NAME. ipynb

Дополнительные сведения о Jupyter Notebook

  • Репозиторий GitHub для Jupyter Notebook
  • Коллекция записных книжек Jupyter Notebook

Отображение файлов Mermaid на GitHub

GitHub Enterprise Cloud поддерживает отрисовку файлов Mermaid в репозиториях. Зафиксируйте файл, как обычно, используя расширение .mermaid или .mmd. Затем перейдите по пути файла Mermaid на GitHub.

Например, при добавлении файла

.mmd со следующим содержимым в репозиторий:

graph TD
    A[Friend's Birthday] -->|Get money| B(Go shopping)
    B --> C{Let me think}
    C -->|One| D["Cool <br> Laptop"]
    C -->|Two| E[iPhone]
    C -->|Three| F[fa:fa-car Car]

При просмотре файла в репозитории он отрисовывается как блок-схема.

Устранение неполадок с файлами Mermaid

Если схема вообще не отрисовывается, убедитесь, что она содержит допустимый синтаксис Mermaid Markdown, проверив схему в динамическом редакторе Mermaid.

Если схема отображается, но не так, как вы ожидали, можно создать новое обсуждение GitHub Community и добавить метку Mermaid.

Известные проблемы
  • Диаграммы последовательностей часто отображаются с дополнительной отбивкой под ними, причем размер отбивки увеличивается с размером диаграммы. Это известная проблема с библиотекой Mermaid.
  • Узлы субъектов с всплывающими меню не работают должным образом в диаграммах последовательности. Это связано с расхождениями, которые возникают в способе добавления событий JavaScript на диаграмму, когда API библиотеки Mermaid используется для отрисовки диаграммы.
  • Не все диаграммы соответствуют требованиям a11y. Это может повлиять на пользователей, которые используют средство чтения с экрана.

Mermaid в Markdown

Синтаксис Mermaid можно внедрить непосредственно в Markdown. Дополнительные сведения см. в разделе Creating diagrams.

Дополнительные сведения о Русалка

  • Документация по Mermaid. js
  • Динамический редактор Mermaid.js

Руководство по Node.js, часть 9: работа с файловой системой

Сегодня, в девятой части перевода руководства по Node.js, мы поговорим о работе с файлами. В частности, речь пойдёт о модулях fs и path — о файловых дескрипторах, о путях к файлам, о получении информации о файлах, об их чтении и записи, о работе с директориями.

[Советуем почитать] Другие части цикла

Часть 1: Общие сведения и начало работы
Часть 2: JavaScript, V8, некоторые приёмы разработки
Часть 3: Хостинг, REPL, работа с консолью, модули
Часть 4: npm, файлы package.json и package-lock.json
Часть 5: npm и npx
Часть 6: цикл событий, стек вызовов, таймеры
Часть 7: асинхронное программирование
Часть 8: Руководство по Node.js, часть 8: протоколы HTTP и WebSocket
Часть 9: Руководство по Node.js, часть 9: работа с файловой системой

Работа с файловыми дескрипторами в Node.

js

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

Дескриптор можно получить, воспользовавшись для открытия файла асинхронным методом open() из модуля fs:

const fs = require('fs')
fs.open('/Users/flavio/test.txt', 'r', (err, fd) => {
  //fd - это дескриптор файла
})

Обратите внимание на второй параметр, r, использованный при вызове метода fs.open(). Это — флаг, который сообщает системе о том, что файл открывают для чтения. Вот ещё некоторые флаги, которые часто используются при работе с этим и некоторыми другими методами:

  • r+ — открыть файл для чтения и для записи.
  • w+ — открыть файл для чтения и для записи, установив указатель потока в начало файла. Если файл не существует — он создаётся.
  • a — открыть файл для записи, установив указатель потока в конец файла. Если файл не существует — он создаётся.
  • a+ — открыть файл для чтения и записи, установив указатель потока в конец файла. Если файл не существует — он создаётся.

Файлы можно открывать и пользуясь синхронным методом fs.openSync(), который, вместо того, чтобы предоставить дескриптор файла в коллбэке, возвращает его:

const fs = require('fs')
try {
  const fd = fs.openSync('/Users/flavio/test.txt', 'r')
} catch (err) {
  console.error(err)
}

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

Данные о файлах

С каждым файлом связан набор данных о нём, исследовать эти данные можно средствами Node.js. В частности, сделать это можно, используя метод stat() из модуля fs.

Вызывают этот метод, передавая ему путь к файлу, и, после того, как Node.js получит необходимые сведения о файле, он вызовет коллбэк, переданный методу stat(). Вот как это выглядит:

const fs = require('fs')
fs.stat('/Users/flavio/test.txt', (err, stats) => {
  if (err) {
    console.error(err)
    return
  }
  //сведения о файле содержатся в аргументе `stats`
})

В Node.js имеется возможность синхронного получения сведений о файлах. При таком подходе главный поток блокируется до получения свойств файла:

const fs = require('fs')
try {
  const stats = fs.statSync ('/Users/flavio/test.txt')
} catch (err) {
  console.error(err)
}

Информация о файле попадёт в константу stats. Что это за информация? На самом деле, соответствующий объект предоставляет нам большое количество полезных свойств и методов:

  • Методы .isFile() и .isDirectory() позволяют, соответственно, узнать, является ли исследуемый файл обычным файлом или директорией.
  • Метод .isSymbolicLink() позволяет узнать, является ли файл символической ссылкой.
  • Размер файла можно узнать, воспользовавшись свойством . size.

Тут имеются и другие методы, но эти — самые употребимые. Вот как ими пользоваться:

const fs = require('fs')
fs.stat('/Users/flavio/test.txt', (err, stats) => {
  if (err) {
    console.error(err)
    return
  }
  stats.isFile() //true
  stats.isDirectory() //false
  stats.isSymbolicLink() //false
  stats.size //1024000 //= 1MB
})

Пути к файлам в Node.js и модуль path

Путь к файлу — это адрес того места в файловой системе, где он расположен.

В Linux и macOS путь может выглядеть так:

/users/flavio/file.txt

В Windows пути выглядят немного иначе:

C:usersflaviofile.txt

На различия в форматах записи путей при использовании разных операционных систем следует обращать внимание, учитывая операционную систему, используемую для развёртывания Node.js-сервера.

В Node.js есть стандартный модуль path, предназначенный для работы с путями к файлам. Перед использованием этого модуля в программе его надо подключить:

const path = require('path')

▍Получение информации о пути к файлу

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

const notes = '/users/flavio/notes.txt'
path.dirname(notes) // /users/flavio
path.basename(notes) // notes.txt
path.extname(notes) // .txt

Здесь, в строке notes, хранится путь к файлу. Для разбора пути использованы следующие методы модуля path:

  • dirname() — возвращает родительскую директорию файла.
  • basename() — возвращает имя файла.
  • extname() — возвращает расширение файла.

Узнать имя файла без расширения можно, вызвав метод .basename() и передав ему второй аргумент, представляющий расширение:

path.basename(notes, path.extname(notes)) //notes

▍Работа с путями к файлам

Несколько частей пути можно объединить, используя метод path.join():

const name = 'flavio'
path.join('/', 'users', name, 'notes.txt') //'/users/flavio/notes.txt'

Найти абсолютный путь к файлу на основе относительного пути к нему можно с использованием метода path. resolve():

path.resolve('flavio.txt') 
//'/Users/flavio/flavio.txt' при запуске из моей домашней папки

В данном случае Node.js просто добавляет /flavio.txt к пути, ведущем к текущей рабочей директории. Если при вызове этого метода передать ещё один параметр, представляющий путь к папке, метод использует его в качестве базы для определения абсолютного пути:

path.resolve('tmp', 'flavio.txt')
// '/Users/flavio/tmp/flavio.txt' при запуске из моей домашней папки

Если путь, переданный в качестве первого параметра, начинается с косой черты — это означает, что он представляет собой абсолютный путь.

path.resolve('/etc', 'flavio.txt')
// '/etc/flavio.txt'

Вот ещё один полезный метод — path.normalize(). Он позволяет найти реальный путь к файлу, используя путь, в котором содержатся спецификаторы относительного пути вроде точки (.), двух точек (..), или двух косых черт:

path.normalize('/users/flavio/. .//test.txt') 
// /users/test.txt

Методы resolve() и normalize() не проверяют существование директории. Они просто находят путь, основываясь на переданным им данным.

Чтение файлов в Node.js

Самый простой способ чтения файлов в Node.js заключается в использовании метода fs.readFile() с передачей ему пути к файлу и коллбэка, который будет вызван с передачей ему данных файла (или объекта ошибки):

fs.readFile('/Users/flavio/test.txt', (err, data) => {
  if (err) {
    console.error(err)
    return
  }
  console.log(data)
})

Если надо, можно воспользоваться синхронной версией этого метода — fs.readFileSync():

const fs = require('fs')
try {
  const data = fs.readFileSync('/Users/flavio/test.txt')
  console.log(data)
} catch (err) {
  console.error(err)
}

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

Методы fs.readFile() и fs.readFileSync() считывают в память всё содержимое файла. Это означает, что работа с большими файлами с применением этих методов серьёзно отразится на потреблении памяти вашим приложением и окажет влияние на его производительность. Если с такими файлами нужно работать, лучше всего воспользоваться потоками.

Запись файлов в Node.js

В Node.js легче всего записывать файлы с использованием метода fs.writeFile():

const fs = require('fs')
const content = 'Some content!'
fs.writeFile('/Users/flavio/test.txt', content, (err) => {
  if (err) {
    console.error(err)
    return
  }
  //файл записан успешно
})

Есть и синхронная версия того же метода — fs.writeFileSync():

const fs = require('fs')
const content = 'Some content!'
try {
  const data = fs.writeFileSync('/Users/flavio/test.txt', content)
  //файл записан успешно
} catch (err) {
  console.error(err)
}

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

fs.writeFile('/Users/flavio/test.txt', content, { flag: 'a+' }, (err) => {})

Тут могут использоваться флаги, которые мы уже перечисляли в разделе, посвящённом дескрипторам. Подробности о флагах можно узнать здесь.

Присоединение данных к файлу

Метод fs.appendFile() (и его синхронную версию — fs.appendFileSync()) удобно использовать для присоединения данных к концу файла:

const content = 'Some content!'
fs.appendFile('file.log', content, (err) => {
  if (err) {
    console.error(err)
    return
  }
  //готово!
})

Об использовании потоков

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

Работа с директориями в Node.js

Модуль fs предоставляет в распоряжение разработчика много удобных методов, которые можно использовать для работы с директориями.

▍Проверка существования папки

Для того чтобы проверить, существует ли директория и может ли Node.js получить к ней доступ, учитывая разрешения, можно использовать метод fs.access().

▍Создание новой папки

Для того чтобы создавать новые папки, можно воспользоваться методами fs.mkdir() и fs.mkdirSync():

const fs = require('fs')
const folderName = '/Users/flavio/test'
try {
  if (!fs.existsSync(dir)){
    fs.mkdirSync(dir)
  }
} catch (err) {
  console.error(err)
}

▍Чтение содержимого папки

Для того чтобы прочесть содержимое папки, можно воспользоваться методами fs.readdir() и fs.readdirSync(). В этом примере осуществляется чтение содержимого папки — то есть — сведений о том, какие файлы и поддиректории в ней имеются, и возврат их относительных путей:

const fs = require('fs')
const path = require('path')
const folderPath = '/Users/flavio'
fs. readdirSync(folderPath)

Вот так можно получить полный путь к файлу:

fs.readdirSync(folderPath).map(fileName => {
  return path.join(folderPath, fileName)
}

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

const isFile = fileName => {
  return fs.lstatSync(fileName).isFile()
}
fs.readdirSync(folderPath).map(fileName => {
  return path.join(folderPath, fileName)).filter(isFile)
}

▍Переименование папки

Для переименования папки можно воспользоваться методами fs.rename() и fs.renameSync(). Первый параметр — это текущий путь к папке, второй — новый:

const fs = require('fs')
fs.rename('/Users/flavio', '/Users/roger', (err) => {
  if (err) {
    console.error(err)
    return
  }
  //готово
})

Переименовать папку можно и с помощью синхронного метода fs.renameSync():

const fs = require('fs')
try {
  fs.renameSync('/Users/flavio', '/Users/roger')
} catch (err) {
  console. error(err)
}

▍Удаление папки

Для того чтобы удалить папку, можно воспользоваться методами fs.rmdir() или fs.rmdirSync(). Надо отметить, что удаление папки, в которой что-то есть, задача несколько более сложная, чем удаление пустой папки. Если вам нужно удалять такие папки, воспользуйтесь пакетом fs-extra, который весьма популярен и хорошо поддерживается. Он представляет собой замену модуля fs, расширяющую его возможности.

Метод remove() из пакета fs-extra умеет удалять папки, в которых уже что-то есть.

Установить этот модуль можно так:

npm install fs-extra

Вот пример его использования:

const fs = require('fs-extra')
const folder = '/Users/flavio'
fs.remove(folder, err => {
  console.error(err)
})

Его методами можно пользоваться в виде промисов:

fs.remove(folder).then(() => {
  //готово
}).catch(err => {
  console.error(err)
})

Допустимо и применение конструкции async/await:

async function removeFolder(folder) {
  try {
    await fs. remove(folder)
    //готово
  } catch (err) {
    console.error(err)
  }
}
const folder = '/Users/flavio'
removeFolder(folder)

Модуль fs

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

const fs = require('fs')

После этого у вас будет доступ к его методам, среди которых отметим следующие, некоторые из которых вам уже знакомы:

  • fs.access(): проверяет существование файла и возможность доступа к нему с учётом разрешений.
  • fs.appendFile(): присоединяет данные к файлу. Если файл не существует — он будет создан.
  • fs.chmod(): изменяет разрешения для заданного файла. Похожие методы: fs.lchmod(), fs.fchmod().
  • fs.chown(): изменяет владельца и группу для заданного файла. Похожие методы: fs.fchown(), fs.lchown().
  • fs.close(): закрывает дескриптор файла.
  • fs.copyFile(): копирует файл.
  • fs.createReadStream(): создаёт поток чтения файла.
  • fs.createWriteStream(): создаёт поток записи файла.
  • fs.link(): создаёт новую жёсткую ссылку на файл.
  • fs.mkdir(): создаёт новую директорию.
  • fs.mkdtemp(): создаёт временную директорию.
  • fs.open(): открывает файл.
  • fs.readdir(): читает содержимое директории.
  • fs.readFile(): считывает содержимое файла. Похожий метод: fs.read().
  • fs.readlink(): считывает значение символической ссылки.
  • fs.realpath(): разрешает относительный путь к файлу, построенный с использованием символов . и .., в полный путь.
  • fs. rename(): переименовывает файл или папку.
  • fs.rmdir(): удаляет папку.
  • fs.stat(): возвращает сведения о файле. Похожие методы: fs.fstat(), fs.lstat().
  • fs.symlink(): создаёт новую символическую ссылку на файл.
  • fs.truncate(): обрезает файл до заданной длины. Похожий метод: fs.ftruncate().
  • fs.unlink(): удаляет файл или символическую ссылку.
  • fs.unwatchFile(): отключает наблюдение за изменениями файла.
  • fs.utimes(): изменяет временную отметку файла. Похожий метод: fs.futimes().
  • fs.watchFile(): включает наблюдение за изменениями файла. Похожий метод: fs.watch().
  • fs.writeFile(): записывает данные в файл. Похожий метод: fs.write().

Интересной особенностью модуля fs является тот факт, что все его методы, по умолчанию, являются асинхронными, но существуют и их синхронные версии, имена которых получаются путём добавления слова Sync к именам асинхронных методов.

Например:

  • fs.rename()
  • fs.renameSync()
  • fs.write()
  • fs.writeSync()

Использование синхронных методов серьёзно влияет на то, как работает программа.

В Node.js 10 имеется экспериментальная поддержка этих API, основанных на промисах.

Исследуем метод fs.rename(). Вот асинхронная версия этого метода, использующая коллбэки:

const fs = require('fs')
fs.rename('before.json', 'after.json', (err) => {
  if (err) {
    return console.error(err)
  }
  //готово
})

При использовании его синхронной версии для обработки ошибок используется конструкция try/catch:

const fs = require('fs')
try {
  fs.renameSync('before.json', 'after.json')
  //готово
} catch (err) {
  console.error(err)
}

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

Модуль path

Модуль path, о некоторых возможностях которого мы тоже уже говорили, содержит множество полезных инструментов, позволяющих взаимодействовать с файловой системой. Как уже было сказано, устанавливать его не нужно, так как он является частью Node.js. Для того чтобы пользоваться им, его достаточно подключить:

const path = require('path')

Свойство path.sep этого модуля предоставляет символ, использующийся для разделения сегментов пути ( в Windows и / в Linux и macOS), а свойство path.delimiter даёт символ, используемый для отделения друг от друга нескольких путей (; в Windows и : в Linux и macOS).

Рассмотрим и проиллюстрируем примерами некоторые методы модуля path.

▍path.basename()

Возвращает последний фрагмент пути. Передав второй параметр этому методу можно убрать расширение файла.

require('path').basename('/test/something') //something
require('path'). basename('/test/something.txt') //something.txt
require('path').basename('/test/something.txt', '.txt') //something

▍path.dirname()

Возвращает ту часть пути, которая представляет имя директории:

require('path').dirname('/test/something') // /test
require('path').dirname('/test/something/file.txt') // /test/something
<h4><font color="#000">▍path.extname()</font></h4>
</code>Возвращает ту часть пути, которая представляет расширение файла:
<source>require('path').dirname('/test/something') // ''
require('path').dirname('/test/something/file.txt') // '.txt'

▍path.isAbsolute()

Возвращает истинное значение если путь является абсолютным:

require('path').isAbsolute('/test/something') // true
require('path').isAbsolute('./test/something') // false

▍path.join()

Соединяет несколько частей пути:

const name = 'flavio'
require('path').join('/', 'users', name, 'notes.txt') //'/users/flavio/notes. txt'

▍path.normalize()

Пытается выяснить реальный путь на основе пути, который содержит символы, использующиеся при построении относительных путей вроде ., .. и //:

require('path').normalize('/users/flavio/..//test.txt') ///users/test.txt

▍path.parse()

Преобразует путь в объект, свойства которого представляют отдельные части пути:

  • root: корневая директория.
  • dir: путь к файлу, начиная от корневой директории
  • base: имя файла и расширение.
  • name: имя файла.
  • ext: расширение файла.

Вот пример использования этого метода:

require('path').parse('/users/test.txt')

В результате его работы получается такой объект:

{
  root: '/',
  dir: '/users',
  base: 'test.txt',
  ext: '.txt',
  name: 'test'
}

▍path.relative()

Принимает, в качестве аргументов, 2 пути. Возвращает относительный путь из первого пути ко второму, основываясь на текущей рабочей директории:

require('path'). relative('/Users/flavio', '/Users/flavio/test.txt') //'test.txt'
require('path').relative('/Users/flavio', '/Users/flavio/something/test.txt') //'something/test.txt'

▍path.resolve()

Находит абсолютный путь на основе переданного ему относительного пути:

path.resolve('flavio.txt') 
//'/Users/flavio/flavio.txt' при запуске из моей домашней папки.

Итоги

Сегодня мы рассмотрели модули Node.js fs и path, которые используются для работы с файловой системой. В следующей части этой серии, на которой она завершается, мы обсудим модули os, events, http, поговорим о работе с потоками и с системами управления базами данных в Node.js.

Уважаемые читатели! Какими npm-пакетами вы пользуетесь при работе с файловой системой в Node.js?

Автор: ru_vds

Источник

Чтение и редактирование файлов в клиентском JavaScript — Полное руководство

Подробное руководство по API FileReader и URL-адресам объектов.

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

Данное руководство охватывает:

  • использование objectURL и FileReader для чтения файлов из файловой системы пользователя
  • получение информации о файле, например: размер, тип и т. д. Шпаргалка в конце

Чтобы ваши пользователи могли выбирать файл со своего устройства, вам сначала нужно создать вход с типом файла 9.0010 .

Чтобы действительно получить файлы из этого ввода, вам потребуется получить доступ к свойству files элемента ввода. Лучше всего сделать это, зарегистрировав прослушиватель событий change в элементе ввода. Таким образом, функция обратного вызова будет вызываться каждый раз, когда пользователь выбирает файл.

То, как вы это сделаете, будет зависеть от используемой вами платформы. Чтобы сделать это руководство как можно более широко применимым, мы будем использовать vanilla JS.

Итого selectedFile является объектом File .

Ввод файла дает нам объектов File , поэтому помимо содержимого самого файла нам доступна некоторая дополнительная информация, такая как:

  • имя — имя файла, включая расширение, но без путь (например, «cat_photo.png»)
  • размер — размер файла в байтах. Чтобы получить размер в более удобном для человека формате, вы можете использовать библиотеку, такую ​​как размер файла или байт. Для простых случаев использования вы даже можете написать собственную логику преобразования.
  • тип — MIME-тип файла (например, «текст/обычный», «изображение/png») 1 января 1970 года в полночь). Вы можете использовать конструктор Date, чтобы преобразовать эту метку времени в более полезный объект javascript Date .

File также имеют два других свойства: File.lastModifiedDate и File.webkitRelativePath , первый из которых устарел, а другой нестандартен, поэтому вам, вероятно, следует избегать их использования. Имейте в виду, что все эти свойства доступны только для чтения.

Файлы и BLOB-объекты

В дополнение к File в javascript есть еще один способ представления файлов, называемый Blob

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

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

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

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

Давайте начнем с чтения текстового файла:

  1. Сначала мы получаем элемент ввода файла и регистрируем на нем прослушиватель событий change , назначая функцию обратного вызова его свойству onchange
  2. Мы получаем выбранный файл
  3. Мы проверяем, действительно ли файл был выбран, и если нет (что может произойти, например, если пользователь нажимает «Отмена» в окне выбора), мы выходим из функции
  4. Затем мы создаем экземпляр FileReader
  5. Затем мы зарегистрировать любые обработчики событий, которые могут нам понадобиться. Для доступа к содержимому файла нам действительно нужно только событие load , которое срабатывает, когда операция чтения завершена успешно . Однако обычно рекомендуется также зарегистрировать обработчик ошибок. Полный список возможных событий доступен чуть дальше в статье вместе с некоторыми советами по обработке ошибок, так что продолжайте читать 😉
  6. После того, как все прослушиватели событий зарегистрированы, мы инициируем операцию чтения, вызвав один из методов readAs , в данном случае readAsText
  7. После завершения операции чтения содержимое файла будет доступно в reader.result , доступ к которому мы можем получить внутри обработчика событий load (функция обратного вызова reader.onload ).

Совет: Вы можете получить доступ к считывателю внутри обработчика событий несколькими способами: читатель === e. target === это . Имейте в виду, что этот недоступен в стрелочных функциях.

Обработка ошибок

В случае ошибки вызывается обработчик событий error , и вы можете найти объект Error в reader.error . Возможные коды ошибок:

  • FileError.NOT_FOUND_ERR — файл не найден
  • FileError.NOT_READABLE_ERR — файл не может быть прочитан
  • FileError.SECURITY_ERR — возникла проблема с безопасностью
  • FileError.ABORT_ERR — возникает при вызове reader.abort() , когда не выполняется операция чтения

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

Состояние готовности

Операция чтения асинхронная , поэтому не пытайтесь получить доступ к reader.result сразу после читается как вызов . Если вам действительно нужно проверить значение reader.result за пределами обработчика событий load , обязательно сначала проверьте значение reader.readyState , которое будет одним из 3 значений:

  • 0 — Читатель создан, но метод readAs еще не вызывался. (ПУСТОЙ)
  • 1 — Вызван один из методов readAs . Выполняется операция чтения, ошибок пока не возникло. (ЗАГРУЗКА)
  • 2 — Операция завершена. Это может означать одно из трех: Файл был успешно прочитан, произошла ошибка чтения или был вызван reader.abort() , и операция была отменена. (ГОТОВО)

Свойство reader.result будет заполнено только в случае успешной операции чтения. Во всех остальных случаях это будет null .

То же самое относится к reader.error , доступ к которому должен осуществляться внутри ошибка обработчик событий.

Типы событий FileReader

Мы уже рассмотрели два наиболее распространенных типа событий чтения, теперь давайте быстро рассмотрим остальные. FileReader имеет шесть типов событий:

  • загрузка — инициируется, когда операция чтения успешно завершена
  • ошибка — инициируется, когда операция чтения сталкивается с ошибкой или Большой двоичный объект считывается и содержит информацию о ходе операции. Может использоваться для реализации загрузочных полос.
  • abort — срабатывает при отмене операции чтения, т.е. когда вызывается reader.abort()
  • loadstart — срабатывает при начале операции чтения , независимо от того, удалось это или нет

Вы, наверное, заметили, что события FileReader работают аналогично обычным событиям DOM. Я считаю, что если думать о них как таковых, то гораздо легче понять их нелинейную, асинхронную природу.

💡 Примечание: Как и в случае с событиями DOM, можно зарегистрировать обработчики событий, используя addEventListener или назначив функцию обратного вызова свойству oneventname средства чтения.

Blob.text()

Также стоит отметить, что для чтения текстовых файлов существует более новый и простой метод: Blob.text() . Помните, что File — это просто Blob с некоторыми дополнительными функциями, поэтому он наследует все методы Blob, включая этот. Это означает, что вы можете использовать этот метод как для больших двоичных объектов, так и для файлов.

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

Теперь, когда мы знаем, как читать текстовые файлы, давайте перейдем к чему-то более интересному: изображениям. Чтобы проиллюстрировать эту тему, мы собираемся создать простой предварительный просмотр выбранного изображения.

Типы файлов

Сначала давайте удостоверимся, что выбранный файл действительно является изображением. Мы можем сделать это с помощью атрибута accept .

Атрибут accept позволяет указать, какие типы файлов будет разрешено выбирать пользователю. Он использует разделенный запятыми список уникальных спецификаторов типов файлов. Каждый спецификатор типа может иметь один из следующих форматов:

  • Расширение имени файла без учета регистра, начинающееся с символа точки («.»). Например: .jpg , .JPEG , .gif , .doc
  • Тип MIME, например: image/jpeg , image/png , text/plain , audio/wav
  • image/* означает «любой файл изображения»
  • audio/* означает «любой аудио-видео файл»
  • 9/0 9 * , что означает «любой видеофайл»

Вы можете смешивать и сочетать их в соответствии с вашим конкретным вариантом использования.

Проверка HTML не идеальна. Например, в Windows будут скрыты только файлы, не соответствующие вашим критериям, но вы все равно можете выбрать «Все файлы (*.*)» или использовать перетаскивание, чтобы выбрать любой файл, который вы хотите. Все это означает, что также неплохо проверить тип файла внутри вашего кода javascript.

Или вы можете настроить отдельные потоки обработки для разных типов файлов. чтобы изучить некоторые обходные пути или полифиллы.

Кроме того, имейте в виду, что «любой файл изображения» будет соответствовать (среди прочего):

  • изображений с далеко не идеальной поддержкой браузера, например webp
  • изображений с прозрачностью, например png
  • анимированные изображения, например gif ‘s

Поэтому убедитесь, что вы поддерживаете все эти функции, или явно укажите только те типы, которые вы планируете поддерживать.

URL-адреса данных и URL-адреса объектов

Для отображения выбранного изображения нам потребуется HTML-файл img и URL-адрес для атрибута img. src . Существует два разных способа представления файла изображения в виде URL-адреса: dataURL и objectURL . Между ними есть несколько важных различий, так что давайте быстро пробежимся по ним.

DataURL

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

Его формат может немного отличаться в зависимости от типа данных, которые он представляет, но для большинства файлов он выглядит следующим образом: data:;base64, , где — тип MIME а — файл в кодировке base64.

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

ObjectURL

Также известен как URL-адрес большого двоичного объекта . Это результат URL.createObjectURL() . Это более новый API, но он все еще довольно хорошо поддерживается. Однако он не будет работать в IE версии 9 и ниже.

Это быстрее и лаконичнее, чем FileReader , но у него есть свои проблемы и ограничения. В отличие от dataURL, он не содержит файловых данных. Это просто ссылка на файл. Другим важным отличием является тот факт, что URL.createObjectURL() — это синхронный .

URL-адрес объекта должен быть отозван, когда он больше не нужен. Браузер сделает это автоматически, когда документ будет выгружен, однако для оптимальной производительности и использования памяти вам не следует полагаться на такое поведение, особенно в больших приложениях с большим количеством URL-адресов объектов. Вместо этого вы должны явно вызывать URL.revokeObjectURL() , когда URL-адрес больше не нужен, например, в обработчике событий image.onload , который мы обсудим позже.

💡 Примечание: , чтобы получить данные файла в кодировке base64 из dataURL, просто извлеките часть строки после запятой, например: dataUrl.slice(dataUrl.indexOf(",") + 1)

Отображение выбранных изображений

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

Использование FileReader и dataURL

  1. Мы регистрируем прослушиватель событий change на вводе файла load прослушиватель событий на считывателе
  2. Внутри обратного вызова onload мы создаем новый элемент изображения,
  3. Затем мы получаем dataURL от reader.result (помните, e. target указывает на считыватель ) и назначьте его атрибуту img.src , как в HTML
  4. . элемент в DOM как дочерний элемент нашего previewContainer . (На самом деле мы могли бы просто создать тег img в HTML и обновить атрибут src в javascript, но такой способ готовит нас к одновременной работе с несколькими изображениями и манипулированию изображениями в Canvas )
  5. Когда все настроено, мы начинаем операцию чтения, используя reader.readAsDataURL(file) , которая активирует наш прослушиватель onload , когда он закончит чтение файла.

Использование объектных URL

  1. Мы регистрируем прослушиватель событий change на вводе файла
  2. Внутри обратного вызова onchange мы получаем выбранный файл и создаем новый элемент изображения
  3. 9 load

    обработчик событий на изображении
  4. Внутри обратного вызова onload URL. revokeObjectURL() отзовет objectURL, как только изображение будет полностью загружено и URL-адрес больше не нужен. Этот шаг необязателен, но настоятельно рекомендуется. Имейте в виду, что если вам понадобится этот URL-адрес где-то еще позже, вы не должны отзывать его.
  5. Как только изображение полностью загрузится, нам больше не понадобится objectURL. Таким образом, внутри обратного вызова onload мы отменяем этот URL. Для этого мы передаем его в качестве аргумента URL.revokeObjectURL() . Мы можем получить URL прямо из атрибута src изображения.
  6. Мы создаем objectURL, передавая выбранный файл в качестве аргумента URL.createObjectURL() и назначая его атрибуту img.src .
  7. После установки атрибута src мы добавляем весь элемент img в DOM как дочерний элемент нашего previewContainer .

💡 Примечание: В других местах вы можете увидеть изображения, созданные с помощью конструктора изображений, т. е. const img = новое изображение () . В большинстве случаев он эквивалентен document.createElement("img") , и у меня никогда не было проблем ни с одним из них. Однако могут быть некоторые крайние случаи (описанные в этом потоке StackOverflow), которые, кажется, делают последний вариант более надежным.

FileList

Прежде чем мы перейдем к чтению нескольких файлов, давайте кое-что проясним. Свойство files на самом деле не является массивом , хотя и выглядит так 😮. это особенный FileList тип данных. Это означает, что у него нет доступа к обычным методам массива (например, map , forEach , reduce ), поэтому для перебора списка вам придется проявить творческий подход. Я покажу вам несколько различных способов сделать это, но если вы хотите узнать больше, ознакомьтесь с этой веткой StackOverflow.

Вы могли также заметить, что хотя мы работали только с одним файлом (до сих пор), нам всегда приходилось записывать файлов[0] . Это потому, что независимо от того, множественный атрибут установлен или нет, inputElement.files всегда является FileList . Это означает, что даже если ввод принимает только один файл, вы все равно должны указать индекс, который в случае единственного элемента равен 0.

💡 Примечание: будет заменен на обычный массив в ближайшем будущем. Скрестим пальцы 🤞

Интерфейс FileList следует считать «подверженным риску», поскольку общая тенденция на веб-платформе заключается в замене таких интерфейсов объектом платформы Array в ECMAScript [ECMA-262]. В частности, это означает, что синтаксис вида filelist.item(0) находится под угрозой; на большинство других программных применений FileList вряд ли повлияет возможная миграция на тип Array.

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

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

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

Как видите, мы создаем отдельный экземпляр FileReader для каждого файла. То же самое, вероятно, может быть достигнуто путем вызова readAsDataURL внутри обработчика событий loadend , но это работает и, вероятно, в любом случае быстрее.

Вот шпаргалка всего процесса обработки файлов, включая все задействованные классы и методы.

Спасибо за внимание.

Если что-то было непонятно, или вы хотите, чтобы я расширил какую-то тему, дайте мне знать в комментариях

Узнайте все 8 свойств фона CSS за 5 минут

Краткое, но полное введение в свойства фона CSS

hadrysmateusz. medium.com

Полное руководство по градиентам CSS

Градиенты снова возвращаются вы знаете, как их использовать

hadrysmateusz.medium.com

20 селекторов CSS, которые вам нужно знать

Убедитесь, что вы знаете эти важные селекторы CSS

medium.com

Кроме того, если вы такой же фанат Vivaldi , как и я, посмотрите мой Thumbnail Generator , это бесплатный инструмент, который я создал, потому что устал создавать миниатюры вручную. Он использует многие концепции из этого поста, и вы можете проверить весь исходный код на GitHub .

Работа с файловой системой в Node.js

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

  • Каталог /tmp
  • Управление /tmp между запусками рабочего процесса
  • Чтение файла из /tmp
  • Запись файла в /tmp
  • Список файлов в /tmp
  • Удаление файла
  • Загрузка файла в / tmp
  • Загрузить файл из /tmp
  • Загрузить файл, загрузить его в другом запросе multipart/form-data
  • Загрузить вложения электронной почты в /tmp, загрузить в Amazon S3

Каталог

/tmp

В рамках рабочего процесса у вас есть полный доступ для чтения и записи к каталогу /tmp . У вас есть 2 ГБ свободного места в /tmp для сохранения любого файла.

Управление

/tmp между запусками рабочего процесса

Каталог /tmp хранится на виртуальной машине, на которой выполняется рабочий процесс. Мы называем это средой исполнения («EE»). Для обработки больших объемов рабочих процессов может быть создано несколько EE. А EE могут быть уничтожены в любой момент (например, примерно через 10 минут отсутствия событий). Это означает, что вы не должны ожидать доступа к файлам между выполнениями. При этом файлы может остаться , поэтому вам следует очистить их, чтобы убедиться, что это не повлияет на ваш рабочий процесс. Используйте пакет tmp-promise (открывается в новом окне) для очистки файлов после использования или удалите файлы вручную.

Чтение файла из

/tmp

В этом примере пошаговый экспорт используется для возврата содержимого тестового файла, сохраненного в /tmp , в виде строки:

Запись файла в

/tmp Используйте Модуль fs (открывается в новом окне) для записи данных в /tmp :

Список файлов в

/tmp

Вернуть список файлов, сохраненных в /tmp :

Удалить файл

Загрузить файл в 90 040

/20031 Пример узнайте, как загрузить файл на /tmp .

Загрузить файл из

/tmp

В этом примере показано, как загрузить файл из /tmp в запросе HTTP.