Как бы вы поступили с Lua5.2 / Apache2 (скрипт Lua, работающий на сервере Apache2, см .: https://httpd.apache.org/docs/trunk/mod/mod_lua.html)?
Вот HTML-форма, которую я пробовал:
<!DOCTYPE html>
<html>
<body>
<form action="/test.lua" method="POST" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="20000000" />
Select image to upload:
<input type="file" name="fileToUpload" id="fileToUpload" />
<input type="submit" value="Upload Image" name="" />
</form>
</body>
</html>
Когда я делаю загрузку файла, я не могу получить ни имя файла, ни содержимое файла.
Вот test.lua:
require("string")
--JSON library: https://github.com/rxi/json.lua
json = require("json")
function handle(r)
r.content_type = "text/plaintext"
local post, postmulti = r:parsebody( 20000000 )
local returnStatus = apache2.OK
if r.method == 'GET' then
r.content_type = "text/html"
r:puts([[
<!DOCTYPE html>
<html>
<body>
<form action="/test.lua" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="20000000" />
Select image to upload:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload Image" name="submit">
</form>
</body>
</html>
]])
elseif r.method == 'POST' then
r.content_type = "text/plaintext"
r.status = 303
r:puts( tostring( r.headers_in["Content-Type"] ) .. "\n" )
r:puts( tostring( r.headers_in["fileToUpload"] ) .. "\n" )
r:puts( tostring( postmulti["fileToUpload"]["name"] ) .. "\n" )
r:puts("POST:\n")
for k, v in pairs( post )do
r:puts(tostring(k) .. "=>" .. tostring(v) .. "\n")
end
r:puts("POSTMULTI:\n")
r:puts( json.encode( getmulti ) )
r:puts( json.encode( postmulti ) )
elseif r.method == 'PUT' then
r:puts("Unsupported HTTP method " .. r.method)
r.status = 405
else
returnStatus = 501
end
return returnStatus
end
Ивот file_upload.txt (файл, который я выбрал для загрузки):
File_Upload_Test_Text_File_Line1
Line2
Line3
Line4_and_last
Вот результаты веб-браузера (Linux x64 / Ubuntu LTS 18.04 / Chromium 74.0.3729.169) (сервер Apache2: Apache / 2.4.29 (Ubuntu))
multipart/form-data; boundary=----WebKitFormBoundarysDrDjKiokpBy5gAE
nil
nil
POST:
submit=>Upload Image
MAX_FILE_SIZE=>20000000
fileToUpload=>File_Upload_Test_Text_File_Line1
Line2
Line3
Line4_and_last
POSTMULTI:
null{"submit":["Upload Image"],"MAX_FILE_SIZE":["20000000"],"fileToUpload":["File_Upload_Test_Text_File_Line1\nLine2\nLine3\nLine4_and_last\n"]}
Множество других ресурсов, которые я нашел в Интернете, я обнаружил, что они не помогают.
Я считаю, что когда веб-браузер отправляет файл, он отправляетимя файла и содержимое файла.Однако, несмотря на документацию Lua / Apache (https://httpd.apache.org/docs/trunk/mod/mod_lua.html#functions), второе возвращаемое значение r:parseargs()
и r:parsebody()
(в документации называемое «GETMULTI» и «POSTMULTI») не возвращает все значенияэто говорит, что делает.Например, "https://test.loc/test.lua?foo=1&foo=2&foo=3" даст вам только GETMULTI["foo"] = {"3"}
и не даст всех переменных (т. Е. foo="1"
и foo="2"
), и сделает то же самое с переменными POST.
Другое дело, что я не могу найти информацию заголовка, относящуюся к файлу. Самое близкое, что я могу найти, это «Content-Type».
Однако я смог получить содержимое файла без имени файла. Я считаю,это потому, что переменные GET / POST перезаписывают на последнюю, определенную браузером / запросом.
Посмотрев на это: Как работает загрузка файла HTTP? , чтобы увидеть, как браузеры отправляют файлзагружает, я не уверен, как получить filename="hello.o"
, как показано в примере. Это потому, что это не заголовок, а переменная POST? Это потому, что это просто случайный (или иначе несовместимый HTTP-запрос)) часть информации, которую отправляет клиент, и Lua / Apache не может извлечь эту информацию?
Помогите ли вы правильно загрузить файл?