Отправка файлов¶
Отправка статических файлов - довольно частая задача в построении и функционировании веб-приложеия. Рассмотрим, как отправлять файлы в приложении на Node.js.
Пусть в каталоге поекта у нас будут три файла:
app.js
about.html
index.htm
Наряду с файлом приложения app.js
определим два html-файла. В файле index.htm
определим следующий код:
1 2 3 4 5 6 7 8 9 10 11 |
|
Аналогично определим код в файле about.html
:
1 2 3 4 5 6 7 8 9 10 11 |
|
Наша задача будет заключаться в том, чтобы отправить их содержимое пользователю.
Первый способ¶
Для считывания файла может применяться метод fs.createReadStream()
, который считывает файл в поток, и затем с помощью метода pipe()
мы можем связать считанные файлы с потоком записи, то есть объектом response
. Итак, поместим в файл app.js
следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Вначале мы получаем запрошенный адрес. Допустим, запрошенный адрес будет соответствовать напрямую пути к файлу на сервере. Затем с помощью асинхронной функции fs.access
проверяем доступность файла для чтения. Первый параметр функции - путь к файлу. Второй параметр - опция, относительно которой проверяется доступ. В данном случае значение fs.constants.R_OK
говорит о том, что мы проверяем права на чтение из файла. Третий параметр функции - функция обратного вызова, которая получает объект ошибки. Если произошла ошибка (файл не доступен для чтения или вовсе не найден), посылаем статусный код 404
.
Для отправки файла применяется цепочка методов
1 |
|
Метод fs.createReadStream("some.doc")
создает поток для чтения - объект fs.ReadStream
. Для получения данных из потока вызывается метод pipe()
, в который передается объект интерфейса stream.Writable
или поток для записи. А именно таким и является объект http.ServerResponse
, который реализует этот интерфейс.
Запустим приложение и в браузере обратимся по адресу http://localhost:3000/index.htm:
Аналогично мы можем обратиться по адресу http://localhost:3000/about.html:
В даном случае отправляются файлы html, но подобным образом мы можем отправлять самые разные файлы. Например, определим в проекте папку public
. И в ней создадим новый файл styles.css
со следующим содержимым:
1 2 3 4 |
|
Применим эти стили на странице index.htm
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
И затем обратимся к index.htm
:
Второй способ¶
Второй способ представляет чтение данных с помощью функции fs.readFile()
и отправка с помощью метода response.end()
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|