UNPKG

@opengis/fastify-table

Version:

core-plugins

67 lines (54 loc) 2.47 kB
import path from 'node:path'; import providers from '../../../plugins/file/providers/index.js'; import getMimeType from '../../../plugins/file/providers/mime/index.js'; /* 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 Шлях до файла для скачування або відображення */ async function download({ params, }, reply) { if (!params?.['*']) return { message: 'not enough params', status: 400 }; const filename = params['*'].startsWith('/') ? params['*'].slice(1) : params['*']; if (!filename) return { message: "required param 'filename'", status: 400 }; if (filename?.includes?.('..')) return { message: 'wrong params', status: 400 }; /* const { security } = getSettings(); const { enabled: externalAccess } = await pg.one('select enabled from admin.data_api where account_name = $1 and api_key = $2', { args: [account, key] }); if ((sid === 35 && !isUser && !externalAccess) || (sid === 1 && !allowedPublicDirs.some((dir) => filename?.includes?.(`${dir}/`)) && !security?.public_dirs?.split(',')?.some((dir) => filename?.includes?.(`${dir}/`))) ) { return { error: 'Немає доступу', status: 403 }; } */ const filepath = filename.startsWith('files/') ? filename : path.join('files', filename); // download const fp = providers({}); const fileStream = await fp.downloadFile(filepath); if (!fileStream) return { error: `Файл не знайдено - ${filename}`, status: 404 }; const headers = { 'Content-Disposition': `attachment; filename=${path.basename(filename)}`, 'Content-Type': getMimeType(filepath), }; reply.headers(headers); return fileStream; } export default download;