* luci/libs: move upload dispatching from dispatcher to cbi.load()
This commit is contained in:
parent
251502e2cd
commit
c0b2cda50e
2 changed files with 54 additions and 58 deletions
|
@ -52,6 +52,7 @@ function load(cbimap, ...)
|
||||||
require("luci.config")
|
require("luci.config")
|
||||||
require("luci.util")
|
require("luci.util")
|
||||||
|
|
||||||
|
local upldir = "/lib/uci/upload/"
|
||||||
local cbidir = luci.util.libpath() .. "/model/cbi/"
|
local cbidir = luci.util.libpath() .. "/model/cbi/"
|
||||||
local func, err = loadfile(cbimap) or loadfile(cbidir..cbimap..".lua")
|
local func, err = loadfile(cbimap) or loadfile(cbidir..cbimap..".lua")
|
||||||
assert(func, err)
|
assert(func, err)
|
||||||
|
@ -70,7 +71,9 @@ function load(cbimap, ...)
|
||||||
return rawget(tbl, key) or _M[key] or _G[key]
|
return rawget(tbl, key) or _M[key] or _G[key]
|
||||||
end}))
|
end}))
|
||||||
|
|
||||||
local maps = {func()}
|
local maps = { func() }
|
||||||
|
local uploads = { }
|
||||||
|
local has_upload = false
|
||||||
|
|
||||||
for i, map in ipairs(maps) do
|
for i, map in ipairs(maps) do
|
||||||
if not instanceof(map, Node) then
|
if not instanceof(map, Node) then
|
||||||
|
@ -78,9 +81,59 @@ function load(cbimap, ...)
|
||||||
return nil
|
return nil
|
||||||
else
|
else
|
||||||
map:prepare()
|
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
|
||||||
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
|
return maps
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -466,63 +466,6 @@ function cbi(model)
|
||||||
|
|
||||||
maps = luci.cbi.load(model, ...)
|
maps = luci.cbi.load(model, ...)
|
||||||
|
|
||||||
local uploads = { }
|
|
||||||
local has_upload = false
|
|
||||||
|
|
||||||
for _, map in ipairs(maps) do
|
|
||||||
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
|
|
||||||
|
|
||||||
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 = "/lib/uci/upload/"..field.name
|
|
||||||
fd = io.open(path, "w")
|
|
||||||
if fd then
|
|
||||||
cbid = field.name
|
|
||||||
prm[cbid] = path
|
|
||||||
-- else
|
|
||||||
-- io.stderr:write("E: " .. err .. "\n")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if field.name == cbid and fd then
|
|
||||||
fd:write(chunk)
|
|
||||||
end
|
|
||||||
|
|
||||||
if eof and fd then
|
|
||||||
fd:close()
|
|
||||||
fd = nil
|
|
||||||
cbid = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
for i, res in ipairs(maps) do
|
for i, res in ipairs(maps) do
|
||||||
res:parse()
|
res:parse()
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue