Невозможно загрузить pdf в Slack "no_file_data" с помощью Elixir и Hackney - PullRequest
0 голосов
/ 28 мая 2020

Я пишу слабого бота в 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}

Я взял за основу этот вопрос: Потоковая передача файла с помощью хакни

Версия:

  • Эликсир : 1.10.2
  • OTP: 22.0.7
  • Hackney: 1.15
  • PLug: 1.10

1 Ответ

0 голосов
/ 29 мая 2020

Проблема решена. Мне просто нужно было убрать {"Content-Type", "multipart/form-data"} в заголовке запроса. Hackney уже предоставляет один с границей .

My 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
...