使用Elixir和Hackney无法将pdf上传至slack "no_file_data"。

问题描述 投票:0回答:1

我在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

  • Elixir: 1.10.2
  • OTP: 22.0.7
  • 哈克尼: 1.15
  • PLug: 1.10
http elixir slack slack-api
1个回答
0
投票

问题解决了。我只需要删除 {"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
© www.soinside.com 2019 - 2024. All rights reserved.