paint-brush
Jy het nie baie kode nodig om 'n weblêerbestuurder te bou niedeur@gliimlang
Nuwe geskiedenis

Jy het nie baie kode nodig om 'n weblêerbestuurder te bou nie

deur Gliimly7m2024/12/17
Read on Terminal Reader

Te lank; Om te lees

Bou nuttige webtoepassing in minder as 100 reëls kode.
featured image - Jy het nie baie kode nodig om 'n weblêerbestuurder te bou nie
Gliimly HackerNoon profile picture

Die oplaai en aflaai van lêers in webblaaier is 'n algemene taak in feitlik enige webtoepassing of diens. Hierdie artikel wys hoe om dit te doen met baie min kodering - in minder as 100 reëls kode. Die databasis wat gebruik word, is PostgreSQL, en die webbediener is Nginx.

Jy sal Gliimly as 'n toepassingsbediener en die programmeertaal gebruik. Dit sal agter die webbediener loop vir werkverrigting en sekuriteit, sowel as om ryker webfunksionaliteit moontlik te maak. Op hierdie manier kan eindgebruiker nie direk met jou toepassingbediener praat nie, want al sulke versoeke gaan deur die webbediener, terwyl jou agterkanttoepassing direk met jou toepassingbediener kan praat vir beter werkverrigting.

As u aanvaar dat u tans aangemelde Linux-gebruiker die toepassing sal besit, 'n bronkodegids sal skep en ook Gliimly-toepassing met die naam "lêerbestuurder" sal skep:


 mkdir filemgr cd filemgr gg -k file-manager


Skep dan PostgreSQL-databasis met die naam "db_file_manager", wat besit word deur tans aangemelde gebruiker (dws wagwoordlose opstelling):

 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


Skep databasiskonfigurasielêer wat deur Gliimly gebruik word wat die databasis beskryf (dit is 'n lêer "db"):

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


Skep SQL-tabel wat lêers sal bevat wat tans op die bediener gestoor is:

 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


Ten slotte, skep bron Gliimly lêers. Skep eers "start.gliim" lêer 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


Skep "list.gliim" lêer 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


Skep "upload.gliim" lêer en 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


Skep "download.gliim" lêer en 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


Skep "delete.gliim" lêer en 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


Doen die aansoek:

 gg -q --db=postgres:db


Begin jou toepassingsbediener:

 mgrg file-manager


'n Webbediener sit voor die Gliimly-toepassingsbediener, so dit moet opgestel word. Hierdie voorbeeld is vir Ubuntu, so wysig Nginx config lêer daar:

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


Voeg dit by "bediener {}"-afdeling ("client_max_body_size" laat toe dat beelde van tipiese groottes opgelaai kan word):

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


Herbegin Nginx:

 sudo systemctl restart nginx


Gaan na jou webblaaier en voer in:

 http://127.0.0.1/file-manager/start


Dit is hoe die eindresultaat lyk. Dit is duidelik dat ons net kaalbeen-HTML gebruik het, maar dit is glad nie die punt hier nie. U kan enige soort front-end-tegnologie gebruik, die punt is om Gliimly as 'n back-end-bediener vir webtoepassings/dienste te demonstreer.

Hier is die tuisskerm, met die vorm om 'n lêer op te laai en 'n skakel na liFilest van lêers:

Lêerbestuurder tuisblad


Lys lêers:

Lys lêer


Vra om 'n lêer uit te vee:

Vra vir skrapbevestiging


Bevestiging van uitvee:

Vee lêer uit