paint-brush
Вам не нужно много кода для создания веб-файлового менеджерак@gliimlang
Новая история

Вам не нужно много кода для создания веб-файлового менеджера

к Gliimly7m2024/12/17
Read on Terminal Reader

Слишком долго; Читать

Создайте полезное веб-приложение менее чем с помощью 100 строк кода.
featured image - Вам не нужно много кода для создания веб-файлового менеджера
Gliimly HackerNoon profile picture

Загрузка и скачивание файлов в веб-браузере — это обычная задача практически в любом веб-приложении или сервисе. В этой статье показано, как это сделать с минимальным кодированием — менее чем в 100 строках кода. Используемая база данных — PostgreSQL, а веб-сервер — Nginx.

Вы будете использовать Gliimly в качестве сервера приложений и языка программирования. Он будет работать за веб-сервером для производительности и безопасности, а также для обеспечения более богатой веб-функциональности. Таким образом, конечный пользователь не сможет напрямую взаимодействовать с вашим сервером приложений, поскольку все такие запросы проходят через веб-сервер, в то время как ваше внутреннее приложение может напрямую взаимодействовать с вашим сервером приложений для лучшей производительности.

Предполагая, что ваш текущий пользователь Linux, вошедший в систему, будет владельцем приложения, создайте каталог с исходным кодом, а также создайте приложение Gliimly с именем «file-manager»:


 mkdir filemgr cd filemgr gg -k file-manager


Далее создайте базу данных PostgreSQL с именем «db_file_manager», принадлежащую текущему вошедшему в систему пользователю (т.е. настройка без пароля):

 echo "create user $(whoami); create database db_file_manager with owner=$(whoami); grant all on database db_file_manager to $(whoami); \q" | sudo -u postgres psql


Создайте файл конфигурации базы данных, используемый Gliimly, который описывает базу данных (это файл «db»):

 echo "user=$(whoami) dbname=db_file_manager" > db


Создайте таблицу SQL, в которой будут храниться файлы, которые в данный момент хранятся на сервере:

 echo "create table if not exists files (fileName varchar(100), localPath varchar(300), extension varchar(10), description varchar(200), fileSize int, fileID bigserial primary key);" | psql -d db_file_manager


Наконец, создайте исходные файлы Gliimly. Сначала создайте файл "start.gliim", скопируйте и вставьте:

 begin-handler /start public @<h2>File Manager</h2> @To manage the uploaded files, <a href="<<p-path "/list">>">click here.</a><br/> @<br/> @<form action="<<p-path "/upload">>" method="POST" enctype="multipart/form-data"> @ <label for="file_description">File description:</label><br> @ <textarea name="filedesc" rows="3" columns="50"></textarea><br/> @ <br/> @ <label for="filename">File:</label> @ <input type="file" name="file" value=""><br><br> @ <input type="submit" value="Submit"> @</form> end-handler


Создайте файл «list.gliim», скопируйте и вставьте:

 begin-handler /list public @<h2>List of files</h2> @To add a file, <a href="<<p-path "/start">>">click here</a><br/><br/> @<table border="1"> @<tr> @ <td>File</td><td>Description</td><td>Size</td><td>Show</td><td>Delete</td> @</tr> run-query @db= \ "select fileName, description, fileSize, fileID from files order by fileSize desc" \ output file_name, description noencode, file_size, file_ID @<tr> @ <td><<p-web file_name>></td><td><<p-web description>><td><<p-web file_size>></td> @ <td><a href="<<p-path "/download">>/file_id=<<p-url file_ID>>">Show</a></td> @ <td><a href="<<p-path "/delete">>/action=confirm/file_id=<<p-url file_ID>>">Delete</a></td> @</tr> end-query @</table> end-handler


Создайте файл «upload.gliim», скопируйте и вставьте:

 begin-handler /upload public get-param filedesc // file description from the upload form get-param file_filename // file name get-param file_location // the path to uploaded file get-param file_size // size in bytes get-param file_ext // the file extension @<h2>Uploading file</h2> run-query @db= \ "insert into files (fileName, localPath, extension, description, fileSize) \ values ('%s', '%s', '%s', '%s', '%s')" \ input file_filename, file_location, file_ext, filedesc, file_size end-query @File <<p-web file_filename>> of size <<p-web file_size>> \ is stored on server at <<p-web file_location>>. \ File description is <<p-web filedesc>>.<hr/> end-handler


Создайте файл «download.gliim», скопируйте и вставьте:

 begin-handler /download public get-param file_id run-query @db= \ "select localPath,extension from files where fileID='%s'" \ input file_id \ output local_path, ext \ row-count num_files if-true ext equal ".jpg" send-file local_path headers content-type "image/jpg" else-if ext equal ".pdf" send-file local_path headers content-type "application/pdf" else-if send-file local_path headers content-type "application/octet-stream" download end-if end-query if-true num_files not-equal 1 @Cannot find this file!<hr/> exit-handler end-if end-handler


Создайте файл «delete.gliim», скопируйте и вставьте:

 begin-handler /delete public @<h2>Delete a file</h2> get-param action get-param file_id run-query @db="select fileName, localPath, description from files where fileID='%s'" output file_name, local_path, desc input file_id if-true action equal "confirm" // get file information to confirm what will be deleted @Are you sure you want to delete file <<p-web file_name>> (<<p-web desc>>)? Click <a href="<<p-path "/delete">>?action=delete&amp;file_id=<<p-url file_id>>">Delete</a> or click the browser's Back button to go back.<br/> else-if action equal "delete" // actual delete file, once confirmed begin-transaction @db run-query @db= "delete from files where fileID='%s'" input file_id error err no-loop if-true err not-equal "0" @Could not delete the file (error <<p-web err>>) rollback-transaction @db else-if delete-file local_path status st if-true st equal GG_OKAY commit-transaction @db @File deleted. Go back to <a href="<<p-path "/start">>">start page</a> else-if rollback-transaction @db @File could not be deleted, error <<p-num st>> end-if end-if else-if @Unrecognized action <<p-web action>> end-if end-query end-handler


Подать заявку:

 gg -q --db=postgres:db


Запустите сервер приложений:

 mgrg file-manager


Веб-сервер находится перед сервером приложений Gliimly, поэтому его нужно настроить. Этот пример для Ubuntu, поэтому отредактируйте файл конфигурации Nginx там:

 sudo vi /etc/nginx/sites-enabled/default


Добавьте это в раздел «server {}» («client_max_body_size» позволяет загружать изображения типичных размеров):

 location /file-manager/ { include /etc/nginx/fastcgi_params; fastcgi_pass unix:///var/lib/gg/file-manager/sock/sock; } client_max_body_size 100M;


Перезапустите Nginx:

 sudo systemctl restart nginx


Откройте веб-браузер и введите:

 http://127.0.0.1/file-manager/start


Вот как выглядит конечный результат. Очевидно, мы использовали только голый HTML, но это не суть. Вы можете использовать любую технологию front-end, суть в том, чтобы продемонстрировать Gliimly как back-end сервер для веб-приложений/сервисов.

Вот главный экран с формой для загрузки файла и ссылкой на liFilest файлов:

Домашняя страница файлового менеджера


Список файлов:

Список файлов


Просьба удалить файл:

Запросить подтверждение удаления


Подтверждение удаления:

Удалить файл