• nginx+lua实现文件上传和下载功能


    openresty下载地址 https://openresty.org/download

    nginx-upload-moudle下载地址: https://github.com/Austinb/nginx-upload-module

    把上面两个安装包放在/data下,并解压

    安装源码编译所需环境:

    yum install -y  gcc  zlib  zlib-devel  pcre pcre-devel openssl openssl-devel perl

    进入openresty目录下执行:

    ./configure --prefix=/data/openresty --add-module=/data/nginx_upload_modulexxxxxx

    这里和nginx的源码编译一样,也可以编译其他模块,nginx能用的,这里也能用

     make && make install

    写入配置:

    vi  nginx.conf:

    1. user root;
    2. worker_processes 20;
    3. error_log logs/error.log notice;
    4. events {
    5. worker_connections 1024;
    6. }
    7. http {
    8. include mime.types;
    9. default_type application/octet-stream;
    10. server {
    11. listen 8082;
    12. server_name localhost;
    13. # 最大允许上传的文件大小
    14. client_max_body_size 200m;
    15. location / {
    16. root html;
    17. index index.html index.htm;
    18. }
    19. set $store_dir "/sdf/slb/openresty/nginx/html/download/"; # 文件存储路径,注意不要漏掉最后的斜杠 /
    20. # 文件上传接口:http://xxx:8082/upfile
    21. location /upfile {
    22. content_by_lua_file conf/lua/upload.lua; # 实现文件上传的逻辑
    23. }
    24. # 文件下载入口: http://xxx:8082/download
    25. location /download {
    26. autoindex on;
    27. autoindex_localtime on;
    28. root html;
    29. index index.html;
    30. }
    31. # redirect server error pages to the static page /50x.html
    32. error_page 500 502 503 504 /50x.html;
    33. location = /50x.html {
    34. root html;
    35. }
    36. }
    37. }

    写入upload.lua文件:(位置根据nginx.conf,文件要创建在nginx/conf/lua/upload.lua下)

    1. -- upload.lua
    2. --==========================================
    3. -- 文件上传
    4. --==========================================
    5. local upload = require "resty.upload"
    6. local cjson = require "cjson"
    7. local chunk_size = 4096
    8. local form, err = upload:new(chunk_size)
    9. if not form then
    10. ngx.log(ngx.ERR, "failed to new upload: ", err)
    11. ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
    12. end
    13. form:set_timeout(1000)
    14. -- 字符串 split 分割
    15. string.split = function(s, p)
    16. local rt= {}
    17. string.gsub(s, '[^'..p..']+', function(w) table.insert(rt, w) end )
    18. return rt
    19. end
    20. -- 支持字符串前后 trim
    21. string.trim = function(s)
    22. return (s:gsub("^%s*(.-)%s*$", "%1"))
    23. end
    24. -- 文件保存的根路径
    25. local saveRootPath = ngx.var.store_dir
    26. -- 保存的文件对象
    27. local fileToSave
    28. --文件是否成功保存
    29. local ret_save = false
    30. while true do
    31. local typ, res, err = form:read()
    32. if not typ then
    33. ngx.say("failed to read: ", err)
    34. return
    35. end
    36. if typ == "header" then
    37. -- 开始读取 http header
    38. -- 解析出本次上传的文件名
    39. local key = res[1]
    40. local value = res[2]
    41. if key == "Content-Disposition" then
    42. -- 解析出本次上传的文件名
    43. -- form-data; name="testFileName"; filename="testfile.txt"
    44. local kvlist = string.split(value, ';')
    45. for _, kv in ipairs(kvlist) do
    46. local seg = string.trim(kv)
    47. if seg:find("filename") then
    48. local kvfile = string.split(seg, "=")
    49. local filename = string.sub(kvfile[2], 2, -2)
    50. if filename then
    51. fileToSave = io.open(saveRootPath .. filename, "w+")
    52. if not fileToSave then
    53. ngx.say("failed to open file ", filename)
    54. return
    55. end
    56. break
    57. end
    58. end
    59. end
    60. end
    61. elseif typ == "body" then
    62. -- 开始读取 http body
    63. if fileToSave then
    64. fileToSave:write(res)
    65. end
    66. elseif typ == "part_end" then
    67. -- 文件写结束,关闭文件
    68. if fileToSave then
    69. fileToSave:close()
    70. fileToSave = nil
    71. end
    72. ret_save = true
    73. elseif typ == "eof" then
    74. -- 文件读取结束
    75. break
    76. else
    77. ngx.log(ngx.INFO, "do other things")
    78. end
    79. end
    80. if ret_save then
    81. ngx.say("save file ok")
    82. end

    找到nginx启动命令,启动nginx:

    nginx/sbin/nginx

    访问8082端口: 成功如下:

    上传文件命令:curl -F 'file=@{要上传文件的绝对路径}'  http://192.168.80.131:8082/upfile

    例子:curl -F 'file=@/data/test.txt' http://192.168.80.131:8082/upfile

    可在nginx.conf 设置上传文件的大小:

    查看上传文件:http://192.168.80.131:8082/download/

    下载文件:

    curl -O http://192.168.80.131:8082/download/test.txt  或者:

    wget    http://192.168.80.131:8082/download/test.txt

  • 相关阅读:
    docker入门级详解
    【每日刷题】Day62
    SSM整合Thymeleaf时,抽取公共页面并向其传递参数
    项目中执行 npm run xxx 的时候发生了什么?
    初识vue里的路由
    Flutter自带国际化适配自动生成方案
    棋盘(马蹄集)
    通过Power Platform自定义D365 CE 业务需求 - 8. 使用PowerApps配置
    R 语言nutrient数据集的可视化
    9. JVM-方法区
  • 原文地址:https://blog.csdn.net/qq_42905448/article/details/127621867