@opengis/fastify-table
Version:
core-plugins
67 lines (54 loc) • 2.47 kB
JavaScript
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;