Browse Source

Upload form for nodemcu-httpserver

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.
ATAMAH 7 years ago
parent
commit
bc3ffffa0c
4 changed files with 186 additions and 0 deletions
  1. 1 0
      http/index.html
  2. 58 0
      http/upload.full.html
  3. BIN
      http/upload.html.gz
  4. 127 0
      http/upload.lua

+ 1 - 0
http/index.html

@@ -29,6 +29,7 @@
       <li><a href="node_info.lua">NodeMCU info</a>: Shows some basic NodeMCU(Lua)</li>
       <li><a href="file_list.lua">List all server files</a>: Displays a list of all the server files. (Lua)</li>
       <li><a href="foo.html">Foo</a>: A file that doesn't exist. Should error (404 error)</li>
+	  <li><a href="upload.html">Upload</a>: update, remove, list files on the server.</li>
    </ul>
 </body>
 </html>

File diff suppressed because it is too large
+ 58 - 0
http/upload.full.html


BIN
http/upload.html.gz


+ 127 - 0
http/upload.lua

@@ -0,0 +1,127 @@
+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
+

Some files were not shown because too many files changed in this diff