我在Elixir中写了一个懈怠的机器人,它必须将一个pdf上传至一个频道。
这是我想出的办法。
{:ok, ref} = :hackney.request(
:post,
"https://slack.com/api/files.upload?"
<> Plug.Conn.Query.encode(%{
"channels" => channel_id,
"filename" => "test.pdf",
"filetype" => "pdf"
}),
[
{"Content-Type", "multipart/form-data"},
{"Authorization", "Bearer xoxb-XXXXX"},
],
:stream_multipart,
[])
:hackney.send_multipart_body(
ref,
{:file, "./test.pdf"})
{:ok, _status, _headers, ref} = :hackney.start_response(ref)
{:ok, body} = :hackney.body(ref)
body |> Poison.decode! |> IO.inspect
但我得到了这个错误%{"error" => "no_file_data", "ok" => false}
我以这个问题为基础..: 流媒体文件使用黑客程序
版本:Elixir:1.10.2
问题解决了。我只需要删除 {"Content-Type", "multipart/form-data"}
在请求的头部。Hackney已经提供了一个带有 边界.
我的 Content-Type
看起来像这样。
Content-Type: multipart/form-data
应该是这样的
Content-Type: multipart/form-data; boundary=---------------------------tlzhgtmgeelwolfm
这里是修改后的代码
{:ok, ref} = :hackney.request(
:post,
"https://slack.com/api/files.upload?"
<> Plug.Conn.Query.encode(%{
"channels" => channel_id,
"filename" => "test.pdf",
"filetype" => "pdf"
}),
[
{"Authorization", "Bearer xoxb-XXXXX"},
],
:stream_multipart,
[])
:hackney.send_multipart_body(
ref,
{:file, "./test.pdf"})
{:ok, _status, _headers, ref} = :hackney.start_response(ref)
{:ok, body} = :hackney.body(ref)
body |> Poison.decode! |> IO.inspect