paint-brush
Je hebt niet veel code nodig om een webbestandsbeheerder te bouwendoor@gliimlang
Nieuwe geschiedenis

Je hebt niet veel code nodig om een webbestandsbeheerder te bouwen

door Gliimly7m2024/12/17
Read on Terminal Reader

Te lang; Lezen

Bouw bruikbare webapplicaties met minder dan 100 regels code.
featured image - Je hebt niet veel code nodig om een webbestandsbeheerder te bouwen
Gliimly HackerNoon profile picture

Het uploaden en downloaden van bestanden in een webbrowser is een veelvoorkomende taak in vrijwel elke webapplicatie of -service. Dit artikel laat zien hoe u dit kunt doen met heel weinig codering - in minder dan 100 regels code. De gebruikte database is PostgreSQL en de webserver is Nginx.

U gebruikt Gliimly als applicatieserver en de programmeertaal. Het draait achter de webserver voor prestaties en beveiliging, en om rijkere webfunctionaliteit mogelijk te maken. Op deze manier kan de eindgebruiker niet rechtstreeks met uw applicatieserver praten, omdat al dergelijke verzoeken via de webserver gaan, terwijl uw back-endapplicatie rechtstreeks met uw applicatieserver kan praten voor betere prestaties.

Ervan uitgaande dat uw momenteel aangemelde Linux-gebruiker de eigenaar is van de applicatie, maakt u een broncodemap en maakt u ook een Gliimly-applicatie met de naam "file-manager":


 mkdir filemgr cd filemgr gg -k file-manager


Maak vervolgens een PostgreSQL-database met de naam "db_file_manager", die eigendom is van de gebruiker die op dat moment is aangemeld (d.w.z. een wachtwoordloze installatie):

 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


Maak een databaseconfiguratiebestand dat door Gliimly wordt gebruikt en dat de database beschrijft (het is een bestand "db"):

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


Maak een SQL-tabel waarin de bestanden worden opgeslagen die momenteel op de server zijn opgeslagen:

 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


Maak ten slotte bronbestanden van Gliimly. Maak eerst het bestand "start.gliim" en kopieer en plak:

 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


Maak het bestand "list.gliim" en kopieer en plak:

 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


Maak het bestand "upload.gliim" aan, kopieer en plak:

 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


Maak het bestand "download.gliim" aan, kopieer en plak:

 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


Maak het bestand "delete.gliim" aan, kopieer en plak:

 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


Maak de aanvraag:

 gg -q --db=postgres:db


Voer uw applicatieserver uit:

 mgrg file-manager


Een webserver staat voor de Gliimly-applicatieserver, dus die moet worden ingesteld. Dit voorbeeld is voor Ubuntu, dus bewerk het Nginx-configuratiebestand daar:

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


Voeg dit toe in het gedeelte "server {}" ("client_max_body_size" zorgt ervoor dat afbeeldingen van typische formaten kunnen worden geüpload):

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


Nginx opnieuw opstarten:

 sudo systemctl restart nginx


Ga naar uw webbrowser en voer het volgende in:

 http://127.0.0.1/file-manager/start


Dit is hoe het eindresultaat eruit ziet. Uiteraard hebben we alleen kale HTML gebruikt, maar dat is hier helemaal niet het punt. Je kunt elke soort front-end technologie gebruiken, het punt is om Gliimly te demonstreren als een back-end server voor webapplicaties/services.

Hier ziet u het startscherm, met het formulier om een bestand te uploaden en een link naar liFilest met bestanden:

Startpagina van bestandsbeheerder


Lijst met bestanden:

Lijstbestand


Vragen om een bestand te verwijderen:

Vraag om bevestiging van verwijdering


Bevestiging van verwijdering:

Bestand verwijderen