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