Subir y descargar archivos en un navegador web es una tarea común en prácticamente cualquier aplicación o servicio web. Este artículo muestra cómo hacerlo con muy poca codificación: en menos de 100 líneas de código. La base de datos utilizada es PostgreSQL y el servidor web es Nginx.
Utilizará Gliimly como servidor de aplicaciones y lenguaje de programación. Se ejecutará detrás del servidor web para mejorar el rendimiento y la seguridad, así como para permitir una funcionalidad web más completa. De esta manera, el usuario final no puede comunicarse directamente con su servidor de aplicaciones porque todas esas solicitudes pasan por el servidor web, mientras que su aplicación back-end puede comunicarse directamente con su servidor de aplicaciones para lograr un mejor rendimiento.
Suponiendo que el usuario de Linux que ha iniciado sesión actualmente será el propietario de la aplicación, cree un directorio de código fuente y también cree una aplicación Gliimly llamada "file-manager":
mkdir filemgr cd filemgr gg -k file-manager
A continuación, cree una base de datos PostgreSQL denominada "db_file_manager", propiedad del usuario que haya iniciado sesión actualmente (es decir, configuración sin contraseña):
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
Crea un archivo de configuración de base de datos utilizado por Gliimly que describe la base de datos (es un archivo "db"):
echo "user=$(whoami) dbname=db_file_manager" > db
Cree una tabla SQL que contendrá los archivos almacenados actualmente en el servidor:
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
Por último, crea los archivos fuente de Gliimly. Primero, crea el archivo "start.gliim" y cópialo y pégalo:
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
Crea el archivo "list.gliim" y copia y pega:
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
Crea el archivo "upload.gliim" y copia y pega:
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
Crea el archivo "download.gliim" y copia y pega:
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
Crea el archivo "delete.gliim" y copia y pega:
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&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
Realizar la solicitud:
gg -q --db=postgres:db
Ejecute su servidor de aplicaciones:
mgrg file-manager
Hay un servidor web delante del servidor de aplicaciones Gliimly, por lo que es necesario configurarlo. Este ejemplo es para Ubuntu, por lo que hay que editar el archivo de configuración de Nginx allí:
sudo vi /etc/nginx/sites-enabled/default
Agregue esto en la sección "servidor {}" ("client_max_body_size" permite cargar imágenes de tamaños típicos):
location /file-manager/ { include /etc/nginx/fastcgi_params; fastcgi_pass unix:///var/lib/gg/file-manager/sock/sock; } client_max_body_size 100M;
Reiniciar Nginx:
sudo systemctl restart nginx
Vaya a su navegador web e ingrese:
http://127.0.0.1/file-manager/start
Así es como se ve el resultado final. Obviamente, usamos HTML básico, pero ese no es el objetivo en absoluto. Puedes usar cualquier tipo de tecnología front-end, el objetivo es demostrar que Gliimly es un servidor back-end para aplicaciones/servicios web.
Aquí está la pantalla de inicio, con el formulario para cargar un archivo y un enlace a liFilest de archivos:
Listado de archivos:
Solicitar eliminar un archivo:
Confirmación de eliminación: