diff options
Diffstat (limited to 'libs/cbi')
-rw-r--r-- | libs/cbi/luasrc/cbi.lua | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua index 8cde0a1777..296ec815ff 100644 --- a/libs/cbi/luasrc/cbi.lua +++ b/libs/cbi/luasrc/cbi.lua @@ -52,6 +52,7 @@ function load(cbimap, ...) require("luci.config") require("luci.util") + local upldir = "/lib/uci/upload/" local cbidir = luci.util.libpath() .. "/model/cbi/" local func, err = loadfile(cbimap) or loadfile(cbidir..cbimap..".lua") assert(func, err) @@ -70,7 +71,9 @@ function load(cbimap, ...) return rawget(tbl, key) or _M[key] or _G[key] end})) - local maps = {func()} + local maps = { func() } + local uploads = { } + local has_upload = false for i, map in ipairs(maps) do if not instanceof(map, Node) then @@ -78,9 +81,59 @@ function load(cbimap, ...) return nil else map:prepare() + if map.upload_fields then + has_upload = true + for _, field in ipairs(map.upload_fields) do + uploads[ + field.config .. '.' .. + field.section.sectiontype .. '.' .. + field.option + ] = true + end + end end end + if has_upload then + local uci = luci.model.uci.cursor() + local prm = luci.http.context.request.message.params + local fd, cbid + + luci.http.setfilehandler( + function( field, chunk, eof ) + if not field then return end + if field.name and not cbid then + local c, s, o = field.name:gmatch( + "cbid%.([^%.]+)%.([^%.]+)%.([^%.]+)" + )() + + if c and s and o then + local t = uci:get( c, s ) + if t and uploads[c.."."..t.."."..o] then + local path = upldir .. field.name + fd = io.open(path, "w") + if fd then + cbid = field.name + prm[cbid] = path + end + end + end + end + + if field.name == cbid and fd then + io.stderr:write("*** CHUNK:"..tostring(#chunk).." ***\n") + fd:write(chunk) + end + + if eof and fd then + fd:close() + fd = nil + cbid = nil + end + end + ) + end + return maps end |