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