YOLO v5 Series - Image & Video Storage ( Openresty + Lua)

c 复制代码
local os = require 'os'
local upload = require 'resty.upload'

get_os_type

c 复制代码
local function get_os_type()
    local os_type = 'unknown'
    if package.config:sub(1,1) == '\\' then
        os_type = 'windows'
    elseif package.config:sub(1,1) == '/' then
        os_type = 'unix'
    end
    return os_type
end

is_windows

c 复制代码
local function is_windows()
    if get_os_type() == 'windows' then
        return true
    end
    return false
end

get_file_name

c 复制代码
local function get_file_name(response)
    local _file_name = ngx.re.match(response, '(.+)filename="(.+)"(.*)')
    if _file_name then 
        return _file_name[2]
    end
end

get_timestamp

c 复制代码
local function get_timestamp_ss()
    local _timestamp = string.format('%d', os.time())
    return _timestamp
end
local function get_timestamp_sss()
    local _timestamp = string.format('%.3f', ngx.now())
    return _timestamp
end
local function get_timestamp_linux()
    local _pipe = io.popen('linux_date "+%s%3N"')
    local _timestamp = _pipe:read("*a")
    _pipe:close()
    _timestamp = _timestamp:gsub('\r\n$', '')
    _timestamp = _timestamp:gsub('\n$', '')
    return _timestamp
end
local function get_timestamp()
    return get_timestamp_sss()
end

get_file_path

c 复制代码
local function assert_path_file(filePath)
    local _file_path = filePath
    if (is_windows()) then
        _file_path = string.gsub(_file_path, '/', '\\')
    end
    _status = os.execute('if not exist ' .. _file_path .. ' mkdir ' .. _file_path)
end
local function get_file_ext(fileName)
    local _file_ext = string.match(fileName, '(%.[^.]+)$')
    return _file_ext
end
local function write_txt_file(filePath, context)
    local _txt_file = nil
    _txt_file = io.open(filePath, 'w+')
    if _txt_file then
        _txt_file:write(context)
        _txt_file:close()
    end
    _txt_file = nil
end
local function get_file_path(uploadFile)
    local _status = false
    local _file_path = ngx.var.client_upload_dir
    local timestamp = os.time()

    assert_path_file(_file_path)

    local dateTable = os.date('*t', timestamp)

    _file_path = string.format('%s/%s', _file_path, string.format('%04d', dateTable.year))
    assert_path_file(_file_path)

    _file_path = string.format('%s/%s', _file_path, string.format('%02d', dateTable.month))
    assert_path_file(_file_path)

    _file_path = string.format('%s/%s', _file_path, string.format('%02d', dateTable.day))
    assert_path_file(_file_path)

    _file_path = string.format('%s/%s', _file_path, string.format('%02d', dateTable.hour))
    assert_path_file(_file_path)

    _file_path = string.format('%s/%s', _file_path, uploadFile)
    if (is_windows()) then
        _file_path = string.gsub(_file_path, '/', '\\')
    end

    return _file_path
end

main

c 复制代码
local i = 0
local message = ''
while true do
    local form_type, form_response, form_error = form:read()
    if not form_type then
        ngx.say('failed to read: ', form_error)
        return
    end
    if form_type == 'header' then
        if form_response[1] ~= 'Content-Type' then
            file_name = get_file_name(form_response[2])
            if file_name then
                i = i + 1

                file_path = get_file_path(file_name)

                file = io.open(file_path, 'wb+')
                if not file then
                    message = string.format('{"code":1,"msg":"%s"}', 'Failed to open file')
                    ngx.say(message)
                    return
                end
            else
            end
        end
    elseif form_type == 'body' then
        if file then
            file_length = file_length + tonumber(string.len(form_response))    
            file:write(form_response)
        else
        end
    elseif form_type == 'part_end' then
        if file then
            file:close()
            file = nil

            local _upload_dir_length = string.len(ngx.var.client_upload_dir) + 1
            _file_path = '/upload' .. string.sub(file_path, _upload_dir_length)
            if (is_windows()) then
                _file_path = string.gsub(_file_path, '\\', '/')
            end
        
            message = string.format('{"code":0,"msg":"%s","data":{"path":"%s"}}', 'success', _file_path)
            ngx.say(message)
        end
    elseif form_type == 'eof' then
        break
    else
    end
end
if (i == 0) then
    message = string.format('{"code":1,"msg":"%s"}', 'Please upload at least one file!')
    ngx.say(message)
    return
end

conf

c 复制代码
location /api/sys/now {
    content_by_lua_block {
		ngx.header.content_type = 'text/html; charset=utf-8'
	    local result = string.format('{"code":0,"msg":"success","data":{"timestamp":"%s","now":"%s"}}', string.format('%.3f', ngx.now()), os.date("%Y-%m-%d %H:%M:%S"))
		ngx.say(result)
    }
}
c 复制代码
D:\msys64\home\unix2linux\lua2>curl "http://localhost:9999/api/sys/now" -s | jq
{
	"code": 0,
	"msg": "success",
	"data": {
		"timestamp": "1732241439.300",
		"now": "2024-11-22 10:10:39"
	}
}

demo

c 复制代码
D:\msys64\home\unix2linux\lua2>curl -X POST -F"file=@lua.png" "http://localhost:9999/api/file/upload"
{"code":0,"msg":"success","data":{"source":"lua.png","path":"/upload/2024/11/22/09/1732240131.092.png"}}

D:\msys64\home\unix2linux\lua2>curl http://localhost:9999/upload/2024/11/22/09/1732240131.092.png.txt
lua.png
D:\msys64\home\unix2linux\lua2>
相关推荐
向哆哆12 天前
高精度织物缺陷检测数据集(适用YOLO系列/1000+标注)(已标注+划分/可直接训练)
yolo·目标检测
前网易架构师-高司机13 天前
带标注的驾驶员安全带识别数据集,识别率99.5%,可识别有无系安全带,支持yolo,coco json,pascal voc xml格式
xml·yolo·数据集·交通·安全带
向哆哆13 天前
粉尘环境分类检测千张图数据集(适用YOLO系列)(已标注+划分/可直接训练)
yolo·分类·数据挖掘
琅琊榜首202013 天前
移动端AI挂机新范式:YOLOv8+NCNN实现无Root视觉自动化
人工智能·yolo·自动化
智驱力人工智能14 天前
地铁隧道轨道障碍物实时检测方案 守护城市地下动脉的工程实践 轨道障碍物检测 高铁站区轨道障碍物AI预警 铁路轨道异物识别系统价格
人工智能·算法·yolo·目标检测·计算机视觉·边缘计算
智驱力人工智能14 天前
机场鸟类活动智能监测 守护航空安全的精准工程实践 飞鸟检测 机场鸟击预防AI预警系统方案 机场停机坪鸟类干扰实时监测机场航站楼鸟击预警
人工智能·opencv·算法·安全·yolo·目标检测·边缘计算
前端摸鱼匠14 天前
YOLOv8使用 Ultralytics 内置功能简化格式转换:介绍如何使用 yolo mode=data 等相关功能或辅助工具来加速和简化数据格式的准备工作
人工智能·yolo·目标检测·机器学习·目标跟踪·视觉检测
hans汉斯14 天前
《数据挖掘》期刊推介&征稿指南
图像处理·人工智能·算法·yolo·数据挖掘·超分辨率重建·汉斯出版社
卓越软件开发14 天前
毕设全栈开发一条龙:Java/SpringBoot/Vue/ 小程序 / Python / 安卓 / AI 图像识别 人脸检测 车牌识别 YOLO
开发语言·spring boot·python·yolo·小程序·毕业设计·课程设计
向哆哆14 天前
单车/共享单车目标检测数据集(适用YOLO系列)(已标注+划分/可直接训练)
人工智能·yolo·目标检测