Lua - опубликовать multipart/form-data и файл через http.request

Я пытаюсь использовать REST APi для Paperless-ngx для загрузки документов на http-сервер, их инструкции следующие.

РАЗМЕЩЕНИЕ документов

API предоставляет специальную конечную точку для загрузки файлов:

/API/документы/post_document/

ОТПРАВЬТЕ составную форму на эту конечную точку, где документ поля формы содержит документ, который вы хотите загрузить в безбумажный формат. Имя файла дезинфицируется, а затем используется для хранения документа во временном каталоге, и потребителю будет дано указание использовать документ оттуда.

Конечная точка поддерживает следующие необязательные поля формы:

title: Укажите заголовок, который потребитель должен использовать для документа.

created: укажите дату и время создания документа (например, «2016-04-19» или «2016-04-19 06:15:00+02:00»).

корреспондент: укажите идентификатор корреспондента, который потребитель должен использовать для документа.

document_type: аналогично корреспонденту.

теги: Похожие на корреспондент. Укажите это несколько раз, чтобы в документ было добавлено несколько тегов.

Конечная точка немедленно вернет «ОК», если процесс потребления документа был запущен успешно. Никакая дополнительная информация о состоянии самого процесса потребления недоступна, так как это происходит в другом процессе.

Хотя я смог добиться того, что мне нужно, с помощью curl (см. ниже), я хотел бы добиться того же результата с помощью Lua.

      curl -H "Authorization: Basic Y2hyaXM62tgbsgjunotmeY2hyaXNob3N0aW5n" -F "title=Companies House File 10" -F "correspondent=12" -F "document=@/mnt/nas/10.pdf" http://192.168.102.134:8777/api/documents/post_document/

На стороне Lua я пробовал разные способы заставить это работать, но все они были безуспешными, в лучшем случае это просто тайм-аут и возвращает ноль.

Обновление: я перешел от нулевого тайм-аута к400 table: 0x1593c00 HTTP/1.1 400 Bad Request {"document":["No file was submitted."]}сообщение об ошибке

Пожалуйста, помогите кто-нибудь..

      local http = require("socket.http")
local ltn12 = require("ltn12")
local mime = require("mime")
local lfs = require("lfs")

local username = "username"
local password = "password"

local httpendpoint = 'http://192.168.102.134:8777/api/documents/post_document/'
local filepath = "/mnt/nas/10.pdf"
local file = io.open(filepath, "rb")
local contents = file:read( "*a" )

-- https://stackoverflow.com/questions/3508338/what-is-the-boundary-in-multipart-form-data

local boundary = "somerndstring"
local send = "--"..boundary..
            "\r\nContent-Disposition: form-data; "..
            "title='testdoc'; document="..filepath..
            --"\r\nContent-type: image/png"..
            "\r\n\r\n"..contents..
            "\r\n--"..boundary.."--\r\n";

-- Execute request (returns response body, response code, response header)

local resp = {}
local body, code, headers, status = http.request {
    url = httpendpoint,
    method = 'POST',
    headers = {
        -- ['Content-Length'] = lfs.attributes(filepath, 'size') + string.len(send),
        -- ["Content-Length"] = fileContent:len(), 
        -- ["Content-Length"] = string.len(fileContent), 
        ["Content-Length"] = lfs.attributes(filepath, 'size'),
        ['Content-Type'] = "multipart/form-data; boundary="..boundary,
        ["Authorization"] = "Basic " .. (mime.b64(username ..":" .. password)),
        --body = send
    },
    source = ltn12.source.file( io.open(filepath,"rb") ),
    sink = ltn12.sink.table(resp)
}

print(body, code, headers, status)
print(table.concat(resp))

if headers then 
    for k,v in pairs(headers) do 
        print(k,v) 
    end
end 

0 ответов

Другие вопросы по тегам