zStack

zStack

马上订阅 zStack RSS 更新: https://blog.noicdi.com/atom.xml

利用 nginx-upload-module 实现文件上传和重命名

2022年3月23日 17:00

近来因为毕设需求,需要有一个简单的文件上传服务,结合 Nginx,最终通过 nginx-upload-module 实现。但是该模块开发者考虑到同时间同名文件上传碰撞,将文件名统一设置为一串经过计算得到的数值,交由后端服务对文件做改动。

本来不是啥大问题,只是网上教程都使用其他语言实现文件重命名,我实在不想因为这么一个简单的需求在毕设中引入其他后端语言,于是决定自写一个模块实现文件重命名功能,源码保存在 nginx-upload-rename-module 中。

毕设内容是基于 Nginx 实现流媒体点播服务器,打算自写一个支持 HLS 协议的模块,实现从 .mp4 到 .m3u8 的转码切分。正好写这个重命名模块,学习 Nginx 模块开发。

此次实验在本地机上进行,在服务器上部署基本一致。

❗ 请注意文末的提示!

思路

nginx-upload-module 的工作流程是将上传文件从 HTTP 报文中剥除,组合成文件,计算特定数值后保存到指定目录;其他文件信息则经过整合写入 HTTP 报文的请求体,交由后端处理。

我本打算直接调用它定义的变量,获取诸如文件名、文件类型等信息,直接完成文件重命名,但是可能是它变量定义时对标志位的设置,无法获取索引也没有记录入散列表,无法获得其值,就此作罢。

输出其 HTTP 报文的过程中,偶然明白了 nginx-upload-module 的 HTTP 报文传递到后端时的具体内容,于是决定对 HTTP 报文做处理,获取其特定字段,保存后用以处理文件。

编译

首先下载 Nginx 源码和两个模块:

1
2
3
wget https://nginx.org/download/nginx-1.20.2.tar.gz
git clone https://github.com/fdintino/nginx-upload-module.git
git clone https://github.com/xQmQ/nginx-upload-rename-module.git

解压缩 Nginx 源码后,有以下三个目录:

1
2
3
4
.
├── nginx-1.20.2
├── nginx-upload-module
└── nginx-upload-rename-module

进入nginx-1.20.2,准备编译。这里我直接将安装路径放在了当前目录:

自行安装 Nginx 源码编译时需要的依赖

1
./configure --prefix=$(pwd)/nginx --add-module=../nginx-upload-rename-module --add-module=../nginx-upload-module

经过检查后得到以下信息:

剩余内容已隐藏

查看完整文章以阅读更多