Как в Node.js Express отдать файл по ссылке: sendFile и static

Короткий ответ: для одного конкретного файла используйте response.sendFile(), а для папки с картинками, CSS, PDF или HTML-файлами — express.static(). В обоих случаях путь к файлу лучше собирать через модуль path, чтобы не зависеть от текущей папки запуска

Запрос «как в node js express отдать файл по ссылке» обычно возникает, когда сервер уже отвечает текстом или JSON, но теперь надо сделать ссылку на файл: скачать PDF, открыть картинку, отдать HTML-страницу или показать документ из папки public

Отдать один файл через sendFile

Создайте структуру

project/
  server.js
  files/
    guide.pdf

Файл server.js

const express = require("express");
const path = require("path");

const app = express();

app.get("/download/guide", (request, response) => {
  const filePath = path.join(__dirname, "files", "guide.pdf");
  response.sendFile(filePath);
});

app.listen(3000, () => {
  console.log("Сервер запущен: http://localhost:3000");
});

Откройте в браузере

http://localhost:3000/download/guide

Express найдет файл и отправит его клиенту

Почему нужен path.join

Новички часто пишут путь строкой вроде "./files/guide.pdf". Иногда это работает, а потом ломается при запуске из другой папки. __dirname указывает на папку текущего файла, а path.join аккуратно собирает путь под вашу операционную систему

Так надежнее

const filePath = path.join(__dirname, "files", "guide.pdf");

Отдать папку файлов через express.static

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

project/
  server.js
  public/
    index.html
    style.css
    images/
      logo.png

Код

const express = require("express");
const path = require("path");

const app = express();

app.use("/static", express.static(path.join(__dirname, "public")));

app.listen(3000, () => {
  console.log("Сервер запущен: http://localhost:3000");
});

Теперь файл public/images/logo.png будет доступен по адресу

http://localhost:3000/static/images/logo.png

Как сделать скачивание вместо открытия

Если файл нужно именно скачать, используйте response.download()

app.get("/download/guide", (request, response) => {
  const filePath = path.join(__dirname, "files", "guide.pdf");
  response.download(filePath, "node-guide.pdf");
});

Браузер будет воспринимать ответ как файл для скачивания

Как не сделать дыру в безопасности

Не берите имя файла из адрес и не склеивайте путь напрямую

const filePath = "./files/" + request.params.name;

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

Мини-практика

Создайте папку public, положите туда index.html и style.css, подключите express.static, откройте HTML по ссылке. Затем сделайте отдельный маршрут /download/readme, который отдает один файл через response.download()

Частые ошибки

Файл не найден Проверьте реальный путь через console.log(filePath). Часто сервер запускается из другой папки

Картинка не открывается по ссылке Проверьте, подключена ли статическая папка и правильно ли указан префикс /static

HTML скачивается, а не открывается Для открытия используйте sendFile, для скачивания — download

Путь работает на macOS, но ломается на Windows Не собирайте путь вручную через /. Используйте path.join

Что почитать дальше по Node.js

Если нужен общий маршрут по теме, откройте рубрику Node.js. Для соседних задач пригодятся эти разборы:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x