Now you can update your files in /http directory of your tiny webserver over Wi-Fi! Drag&drop or browse one or multiple files. List uploaded files. Delete files. Automatically rename files to http/(filename) Automatically compile .lua files. Shows total/used memory. You must compile upload.lua file! Have some bugs but works pretty well even for uploading lot of files.
128 lines
3.0 KiB
Lua
128 lines
3.0 KiB
Lua
return function (connection, req, args)
|
|
dofile("httpserver-header.lc")(connection, 200, 'application/json')
|
|
connection:send('{')
|
|
|
|
local mbOffset = nil
|
|
local mbLen = nil
|
|
local mbData = nil
|
|
local mbCmd = nil
|
|
local mbFilename = nil
|
|
local fieldsCount = 0
|
|
local fileSize = 0
|
|
local i = 0
|
|
local binaryData = ''
|
|
local currentByte = nil
|
|
|
|
for name, value in pairs(args) do
|
|
if (name == "offset") then
|
|
mbOffset = tonumber(value, 10)
|
|
|
|
fieldsCount = fieldsCount + 1
|
|
end
|
|
if (name == "len") then
|
|
mbLen = tonumber(value, 10)
|
|
|
|
fieldsCount = fieldsCount + 1
|
|
end
|
|
if (name == "data") then
|
|
mbData = value
|
|
|
|
fieldsCount = fieldsCount + 1
|
|
end
|
|
if (name == "filename") then
|
|
mbFilename = value
|
|
|
|
fieldsCount = fieldsCount + 1
|
|
end
|
|
if (name == "filesize") then
|
|
fileSize = tonumber(value, 10)
|
|
|
|
fieldsCount = fieldsCount + 1
|
|
end
|
|
if (name == "cmd") then
|
|
mbCmd = value
|
|
|
|
fieldsCount = fieldsCount + 1
|
|
end
|
|
end
|
|
|
|
if (mbCmd == 'upload') then
|
|
if (fieldsCount > 5) then
|
|
if (mbFilename ~= 'upload.lua') then
|
|
connection:send('"offset":"' .. mbOffset .. '",')
|
|
connection:send('"len":"' .. mbLen .. '",')
|
|
connection:send('"filename":"' .. mbFilename .. '"')
|
|
|
|
mbFilename = 'http/' .. mbFilename
|
|
|
|
for i=1,string.len(mbData),2 do
|
|
currentByte = tonumber(string.sub(mbData, i, i + 1), 16)
|
|
binaryData = binaryData .. string.char(currentByte)
|
|
end
|
|
|
|
if (mbOffset > 0) then
|
|
file.open(mbFilename .. '.dnl','a+')
|
|
else
|
|
file.remove(mbFilename .. '.dnl')
|
|
file.open(mbFilename .. '.dnl','w+')
|
|
end
|
|
file.seek("set", mbOffset)
|
|
file.write(binaryData)
|
|
file.close()
|
|
|
|
binaryData = nil
|
|
|
|
if (fileSize == mbLen + mbOffset) then
|
|
file.remove(mbFilename)
|
|
file.rename(mbFilename .. '.dnl', mbFilename)
|
|
file.remove(mbFilename .. '.dnl')
|
|
|
|
if (string.sub(mbFilename, -4) == '.lua') then
|
|
file.remove(string.sub(mbFilename, 0, -3) .. "lc")
|
|
node.compile(mbFilename)
|
|
file.remove(mbFilename)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
elseif (mbCmd == 'list') then
|
|
local remaining, used, total=file.fsinfo()
|
|
|
|
local headerExist = 0
|
|
|
|
connection:send('"files":{')
|
|
|
|
for name, size in pairs(file.list()) do
|
|
local isHttpFile = string.match(name, "(http/)") ~= nil
|
|
|
|
if isHttpFile then
|
|
if (headerExist > 0) then
|
|
connection:send(',')
|
|
end
|
|
|
|
local url = string.match(name, ".*/(.*)")
|
|
|
|
connection:send('"' .. url .. '":"' .. size .. '"')
|
|
|
|
headerExist = 1
|
|
end
|
|
end
|
|
|
|
connection:send('},')
|
|
|
|
connection:send('"total":"' .. total .. '",')
|
|
connection:send('"used":"' .. used .. '",')
|
|
connection:send('"free":"' .. remaining .. '"')
|
|
elseif (mbCmd == 'remove') then
|
|
if (fieldsCount > 1) then
|
|
if (mbFilename ~= 'upload.lua') and (mbFilename ~= 'upload.lc') and (mbFilename ~= 'upload.html.gz') then
|
|
file.remove('http/' .. mbFilename)
|
|
end
|
|
end
|
|
end
|
|
|
|
connection:send('}')
|
|
collectgarbage()
|
|
end
|
|
|