Как принять загрузку файла в Lua / Apache - PullRequest
0 голосов
/ 12 июня 2019

Как бы вы поступили с 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 не может извлечь эту информацию?

Помогите ли вы правильно загрузить файл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...