


How to solve the problem of setting up file upload and download service with nginx+lua
Main logic
Upload
The front end requests the nginx service, and nginx calls the upload script. The script By searching the configuration, find the corresponding logical storage path and the IP and port of the agent of the physical storage machine, send the package to the corresponding agent through tcp, and the agent deployed on the corresponding machine receives the data and writes it to a local file.
Download
http download request nginx, nginx calls the download script, the script parses the link parameters, finds the corresponding agent address according to the parameters, the request returns the file binary content, the script accepts The data returned by the agent is returned to the requesting end.
Configuring nginx+lua
Next, we will mainly talk about the nginx installation configuration (this includes lua's binary stream processing lpack, md5 calculation, mysql operation, json operation)
1. Install nginx
Download
Unziptar -xvf nginx-1.10.3.tar.gz
2. Install luajit( Lightweight lua)
Modify the installation path in the makefile export prefix= /usr/local/luajit
Then install make &make install
3. Install nginx_lua_module
Download
Unzip
4. Install ngx_devel_kit (ndk provides functions and macros to handle some basic tasks, reducing the amount of code for third-party module development)
Download
5. Install and compile, import
export luajit_lib=/usr/local/luajit/lib export luajit_inc=/usr/local/luajit/include/luajit-2.0 ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/home/oicq/jeffzhuang/ngx_devel_kit-0.3.0 --add-module=/home/oicq/jeffzhuang/lua-nginx-module-0.10. make -j2 make install
Start /usr/local/nginx/sbin/nginx Restart command` usr/local/nginx/sbin/nginx -s reload v
If an error is reported and the luajit library cannot be found ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
Test nginx and open the browser directly You can see the welcome interface at http:10.x.x.x:8080
6. Configure conf/nginx.conf to run the lua script
Add the search path of the lua library lua_package_path, lua_package_cpath
7. Add mysql.lua download and copy it to the lua_package_path directory.
8. Add csjon
Modify the makefile. prefix=/usr/local/luajit is the installation path of luajit. After make, copy the generated cjson.so to the
lua_package_cpath directory
9. To install lpack, you can use the ready-made lpack.lua Copy to lua_package_path or use https://github.com/luadist/lpack to compile and generate lpack.so. Copy to lua_package_cpath. For 64-bit, you need to add the compilation command -fpic
10, upload.lua download
11. md5 download
Main code
1. Front-end upload page code
<!doctype html> <html> <head> <title>file upload example</title> </head> <body> <form action="emer_upload/order_system_storage" method="post" enctype="multipart/form-data"> <input type="file" name="testfilename"/> <input type="submit" name="upload" value="upload" /> </form> </body> </html>
2. Upload upload code. This module parses the file upload request. In the process, it is mainly implemented using a simple algorithm similar to a finite state machine, and different states are processed by corresponding handlers.
--文件下载服务写到 saverootpath .."/" .. filename 下面 function download() local chunk_size = 4096 local form,err=upload:new(chunk_size) if not form then ngx.log(ngx.err, "failed to new upload: ", err) ngx.exit(ngx.http_internal_server_error) end form:set_timeout(100000) while true do local typ,res,err=form:read() if not typ then errormsg="failed to read :"..err return 1 end if typ =="header" then local key=res[1] local value=res[2] if key =="content-disposition" then local kvlist=string.split(value,';') for _, kv in ipairs(kvlist) do local seg = string.trim(kv) if seg:find("filename") then local kvfile = string.split(seg, "=") filename = string.sub(kvfile[2], 2, -2) if filename then --获取文件后缀名字 fileextension=getextension(filename) local linuxtime=tostring(os.time()) filepath=saverootpath .."/" ..linuxtime..filename filetosave,errmsg = io.open(filepath, "w+") --存储的文件路径 --ngx.say("failed to open file ", filepath) if not filetosave then --ngx.say("failed to open file ", filepath .. errmsg) errormsg="打开文件失败"..filepath .. errmsg return 1 end else errormsg="请求参数找不到文件名字" return 1 end --跳出循环 break end end end elseif typ =="body" then if filetosave then filetosave:write(res) filemd5:update(res) end elseif typ =="part_end" then if filetosave then local md5_sum=filemd5:final() --ngx.say("md5: ", str.to_hex(md5_sum)) filemd532=str.to_hex(md5_sum) filetosave:close() filetosave = nil end elseif typ =="eof" then break else ngx.log(ngx.info, "do other things") end end return 0 end
3. TCP receives binary data
-- 读取byte function readint8(tcp) local next, val = string.unpack(tcp:receive(1), "b") return tonumber(val); end -- 读取int16 function readint16(tcp) local next, val = string.unpack(tcp:receive(2), "h"); return tonumber(val); end -- 读取int32 function readint32(tcp) local next, val = string.unpack(tcp:receive(4), ">i"); return tonumber(val); end -- 读取字符串 function readstring(tcp,len) return tostring(tcp:receive(len)); end
4. TCP writes binary data. The communication protocol with the agent here is: start flag + packet length + json string + end flag, so The parameter corresponding to pack is biab, > is converted into big endian
jsondata["filename"]=filemd532 .. "." .. fileextension jsondata["cmd"]="write" jsondata["filesize"]=tostring(filelen) jsondata["path"]=system.."/"..storagedate local jsonstr=cjson.encode(jsondata) local uilen=string.len(jsonstr) senddata=bpack(">b1iab",startindex,uilen,jsonstr,endindex) socket:send(senddata)
5. When there is a download error, redirect is used to jump directly to the error page to facilitate the output of error information. In fact, you can also be a user here token verification
local errorurl="/downloaderror.html" errormsg="url 参数解析有问题 "..index return ngx.redirect(errorurl.."?msg="..errormsg,``` ngx.http_moved_temporarily)
The above is the detailed content of How to solve the problem of setting up file upload and download service with nginx+lua. For more information, please follow other related articles on the PHP Chinese website!

At the beginning of the new year, Lei Jun shared three New Year's wishes for 2025 at the beginning of the new year, and this four and a half hours-long live broadcast attracted a lot of attention. Lei Jun’s three major wishes are: First, achieve the delivery target of 300,000 vehicles, alleviate the pressure, and no longer be caught up by progress. Second, have more travel time, enjoy the beautiful scenery from all over the world, taste special food, and conduct car testing in combination with work. Third, stick to fitness and plan to check in 100 times in the gym to strengthen your body. Lei Jun admitted in the live broadcast that he traveled around in 2024, with a compact schedule, so he often only stayed for a short time, making it difficult to experience the local culture in depth. For example, at the New North Speedway in Germany, he stayed for only 8 hours. Therefore, in the new year, he hopes to be able to better balance work and life and travel

The micro-film "Memory Travel" created by No. 9 and brand spokesperson Yi Yang Qianxi won several authoritative media awards in 2024 and became a masterpiece of the year. This work has won high praise from the industry for its unique narrative style, exquisite production and sincere emotions. 2024 Awards and Honors: 2024 Gold Touch Global Business Innovation Award - Annual Film and Television Advertising 2024 China Advertising Marketing Award - Entertainment Marketing Group Silver Award 2024 Top Digital Innovation Marketing Award - Film and Television Production Gold Award 2024 Shanghai International Advertising Festival - Microfilm Silver Award 2024 The 11th China Innovation Communication Award - Integrated Marketing Silver Award WISE 2024 King of Business - Annual Case 31st China International Advertising Festival 2024 Digital Marketing Practical Big

Recently, the PConline2024 Zhizhen Technology Award was officially announced, and AGON Aidong QD-OLED e-sports display AG326UD won the "Technical Innovation of the Year" award. This honor not only represents the industry's high recognition of its technological advantages and market performance, but also fully reflects AGON's innovative capabilities and outstanding achievements in the field of e-sports display technology. 01. Looking at the future of technology, the authoritative value of the PConline Zhizhen Technology Award is the weather vane of the technology industry. The PConline Zhizhen Technology Award has successfully won wide industry recognition with its rigorous evaluation system and in-depth industry analysis. The award has always been committed to commending outstanding products and brands that promote the development of the technology industry, covering technology

Mark Cerny, chief architect of SonyInteractiveEntertainment (SIE, Sony Interactive Entertainment), has released more hardware details of next-generation host PlayStation5Pro (PS5Pro), including a performance upgraded AMDRDNA2.x architecture GPU, and a machine learning/artificial intelligence program code-named "Amethylst" with AMD. The focus of PS5Pro performance improvement is still on three pillars, including a more powerful GPU, advanced ray tracing and AI-powered PSSR super-resolution function. GPU adopts a customized AMDRDNA2 architecture, which Sony named RDNA2.x, and it has some RDNA3 architecture.

Microsoft's improvements to Windows search functions have been tested on some Windows Insider channels in the EU. Previously, the integrated Windows search function was criticized by users and had poor experience. This update splits the search function into two parts: local search and Bing-based web search to improve user experience. The new version of the search interface performs local file search by default. If you need to search online, you need to click the "Microsoft BingWebSearch" tab to switch. After switching, the search bar will display "Microsoft BingWebSearch:", where users can enter keywords. This move effectively avoids the mixing of local search results with Bing search results

To celebrate the 20th anniversary of Capcom's "Monster Hunter" series, Baodao Club launched a unique magazine set - "Monster Hunter" themed barbecue timer and accompanying cup. The set will be available at home convenience stores nationwide in Japan on December 27, and will be priced at 3,498 yen. The biggest highlight of this magazine set is its interactive barbecue timer, which perfectly replicates the classic barbecue scenes in the series of games. The timer is designed with an old version of the barbecue tool, equipped with LED flame light effects and game BGM, allowing you to experience the fun of hunting during the actual barbecue process. The rotating handle simulates flipped barbecue. After successfully baking, the voice prompt of "Baked!" will be played. The timer size is about 9.5cm (height) x 10.7cm (width) x 8cm (deep), built-in L

Xiaomi Auto’s first anniversary celebration will give car owners a New Year gift! After the delivery volume exceeded 130,000 vehicles last year, Xiaomi Auto’s official Weibo announced that it will give Lei Jun’s classic quotation “AreyouOK?” to every Xiaomi SU7 owner and prospective owner. The number is limited and free to receive it! Activity time: 4 pm on December 28, 2024 to 23:59:59 on January 20, 2025. Users who purchase a car or complete an order before 23:59:59 on December 31, 2024 can get a set of four-piece "AreyouOK?" valve core caps for free. This valve core cap was first released in September this year and is made of bright yellow PVC and brass material. The brass core is directly embedded to ensure safe driving and not easy to fall off. Widely used,

It is reported that the HDMI2.2 standard is expected to be officially released on the eve of the 2025 CES exhibition. HDMIForum plans to announce this new generation of video signal transmission protocol specifications on January 6. The HDMI2.1 standard released in 2017 has a maximum bandwidth of 48Gbps, supports 4K144Hz and 8K30Hz video transmission, and can be up to 10K120Hz with DSC technology. HDMI2.2 is expected to significantly increase bandwidth, support higher resolution and refresh rate, and adopt new wires. Although the specific specifications have not been disclosed yet, HDMI2.2 will inevitably surpass the 48Gbps bandwidth and 10240*4320 resolution limit of HDMI2.1. Given that DisplayPort2.1 is at 20


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

Zend Studio 13.0.1
Powerful PHP integrated development environment

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

SublimeText3 Mac version
God-level code editing software (SublimeText3)

VSCode Windows 64-bit Download
A free and powerful IDE editor launched by Microsoft