UNPKG

@opengis/fastify-table

Version:

core-plugins

66 lines (65 loc) 2.48 kB
import path from "node:path"; import providers from "../../../plugins/file/providers/index.js"; import getMimeType from "../../../plugins/file/providers/mime/index.js"; import logger from "../../../plugins/logger/getLogger.js"; import applyHook from "../../../plugins/hook/applyHook.js"; const { downloadFile } = providers(); /* const allowedPublicDirs = [ 'upload', 'page', 'site', 'maps', 'tmp', 'uploads', 'site_slider', 'module', 'product', 'image', 'geo_works_file', ]; */ /** * Апі використовується для скачування файлів за допомогою fs або s3 * * @method GET * @summary Апі для скачування файлів за провайдером * @priority 4 * @alias download * @type api * @tag file * @requires getMimeType * @param {Object} params Параметри URL * @errors 400,404,403,500 * @returns {Number} status Номер помилки * @returns {String|Object} error Опис помилки * @returns {Object} headers Заголовки HTTP * @returns {String} pipe Шлях до файла для скачування або відображення */ export default async function download({ params, user }, reply) { if (!params?.["*"]) { return reply.status(400).send({ error: "not enough params", code: 400 }); } const filename = params["*"].startsWith("/") ? params["*"].slice(1) : params["*"]; if (!filename) { return reply .status(400) .send({ error: "required param 'filename'", code: 400 }); } if (filename.includes?.("../")) { return reply.status(403).send({ error: "wrong params", code: 403 }); } const filepath = filename.startsWith("files/") ? filename : path.join("files", filename); const hookData = await applyHook("preDownload", { user, relpath: filepath, reply, }); if (hookData) return hookData; const fileStream = await downloadFile(filepath); if (!fileStream) { return reply .status(404) .send({ error: `Файл не знайдено - ${filename}`, code: 404 }); } const headers = { "Content-Disposition": `attachment; filename=${path.basename(filename)}`, "Content-Type": getMimeType(filepath), }; logger.file("file/download", { filepath: params["*"], uid: user?.uid }); reply.headers(headers); return fileStream; }