@opengis/fastify-table
Version:
core-plugins
62 lines (61 loc) • 2.62 kB
JavaScript
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;
}