UNPKG

@opengis/fastify-table

Version:

core-plugins

62 lines (61 loc) 2.62 kB
import path from "node:path"; import mime from "../../../plugins/file/providers/mime/index.js"; import isFileExists from "../../../plugins/file/isFileExists.js"; import downloadFile from "../../../plugins/file/downloadFile.js"; import logger from "../../../plugins/logger/getLogger.js"; import applyHook from "../../../plugins/hook/applyHook.js"; /** * Апі використовується для отримання різних файлів і можливістю змінювати їх * * @method GET * @summary Отримання файлів з директорії системи * @priority 5 * @alias files * @type api * @tag file * @requires getFile * @requires mime * @param {Object} params Параметри URL * @errors 500 * @returns {Number} status Номер помилки * @returns {String} error Опис помилки * @returns {Object} headers Заголовки HTTP * @returns {String} pipe Шлях до файла для скачування або відображення */ export default async function getFile({ params, user }, reply) { if (!params?.["*"]) { return reply.status(400).send({ error: "not enough params", code: 400 }); } if (params["*"].includes("../")) { return reply.status(403).send({ error: "wrong params", code: 403 }); } const relpath = (params["*"].startsWith("/") ? params["*"].slice(1) : params["*"]).replace(/files\//g, "") + (params["*"].endsWith("/") ? "index.html" : ""); if (!relpath) { return reply .status(400) .send({ error: "required param 'filename'", code: 400 }); } if (relpath.includes("../")) { return reply.status(403).send({ error: "wrong params", code: 403 }); } const hookData = await applyHook("preFile", { user, relpath, reply }); if (hookData) return hookData; const filepath = path.join("files", relpath); const exists = await isFileExists(filepath); if (!exists) { return reply.status(404).send({ error: "Файл не знайдено", code: 404 }); } const fileStream = await downloadFile(filepath); if (!fileStream) { return reply.status(404).send({ error: "Файл не знайдено", code: 404 }); } const headers = { "Content-Disposition": `inline; filename=${path.basename(filepath)}`, "Cache-Control": "max-age=86400", "Content-Type": `${mime(filepath)}`, // ; charset=utf-8 --- untested }; reply.headers(headers); logger.file("file/files", { filepath: params["*"], uid: user?.uid }); return fileStream; }