Веб браузерге файлдарды жүктөө жана жүктөө дээрлик бардык веб-тиркемелерде же кызматтарда жалпы милдет. Бул макалада муну өтө аз коддоо менен кантип жасоо керектиги көрсөтүлөт - коддун 100дөн аз саптарында. Колдонулган маалымат базасы PostgreSQL, ал эми веб-сервер Nginx.
Сиз Gliimlyди колдонмо сервери жана программалоо тили катары колдоносуз. Ал иштөө жана коопсуздук үчүн, ошондой эле бай веб-функцияларды иштетүү үчүн веб-сервердин артында иштейт. Ошентип, акыркы колдонуучу сиздин тиркеме сервериңиз менен түз сүйлөшө албайт, анткени мындай суроо-талаптардын баары веб-сервер аркылуу өтөт, ал эми арткы тиркемеңиз жакшыраак иштеши үчүн тиркеме сервериңиз менен түз сүйлөшө алат.
Сиздин учурда кирген Linux колдонуучуңуз тиркемеге ээ болот деп ойлосоңуз, баштапкы код каталогун түзүп, ошондой эле "файл-менеджер" деп аталган Gliimly тиркемесин түзөт:
mkdir filemgr cd filemgr gg -k file-manager
Андан кийин, учурда кирген колдонуучуга таандык "db_file_manager" деп аталган PostgreSQL маалымат базасын түзүңүз (б.а. сырсөзсүз орнотуу):
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&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
Муну "сервер {}" бөлүмүнө кошуңуз ("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 колдондук, бирок бул жерде эч нерсе эмес. Сиз алдыңкы технологиянын каалаган түрүн колдоно аласыз, Gliimlyди веб-тиркемелер/кызматтар үчүн сервер катары көрсөтүү.
Бул жерде файлды жүктөө формасы жана liFilest файлдарына шилтемеси бар үй экраны:
Листинг файлдары:
Файлды жок кылуу суралууда:
Жок кылууну ырастоо: