Файл Elixir POST в файл Heroku Надстройка сканера вложений

Я пытаюсь проверить загруженные документы на наличие вирусов, когда пользователь загружает их, используя надстройку Heroku Сканер вложений .

Я пытаюсь закодировать файл напрямую с помощью Poison.encode, но он выдает ошибку, поэтому я не уверен, что это правильный метод. Приветствуется любая помощь, ниже приведена моя попытка отправить запрос HTTPoison и ошибка от Poison.encode!.

def scan do
    url = System.get_env("ATTACHMENT_SCANNER_URL") <> "/requests"
    token = System.get_env("ATTACHMENT_SCANNER_API_TOKEN")

    headers =
      [
        "Authorization": "bearer " <> token,
        "Content-Type": "multipart/form-data",
      ]

    file_path = local_path_to_pdf_file
    file = file_path |> File.read!

    body = Poison.encode!(%{file: file})

    res = HTTPoison.post(url, body, headers, recv_timeout: 40_000)
  end

Ошибка Poison.encode(файл):

iex(3)> Poison.encode(file)
** (FunctionClauseError) no function clause matching in Poison.Encoder.BitString.chunk_size/3

    The following arguments were given to Poison.Encoder.BitString.chunk_size/3:

        # 1
        <<226, 227, 207, 211, 13, 10, 49, 48, 51, 32, 48, 32, 111, 98, 106, 13, 60, 60,
          47, 76, 105, 110, 101, 97, 114, 105, 122, 101, 100, 32, 49, 47, 76, 32, 50,
          53, 50, 53, 51, 52, 51, 47, 79, 32, 49, 48, 53, 47, 69, 32, ...>>

        # 2
        nil

        # 3
        1

пс. Мне нужно отправить файл напрямую, и я не могу разместить изображение публично, поэтому примеры node.js в документации не будут работать.


person JMurphyWeb    schedule 23.05.2018    source источник
comment
У вас есть два Poison.encode! вызова. Какой из них выдает эту ошибку?   -  person Dogbert    schedule 23.05.2018
comment
Обновлено. Кодирование файла выдает ошибку.   -  person JMurphyWeb    schedule 23.05.2018


Ответы (2)


file = "/some/path/video.mp4" 
HTTPoison.post( "api.vid.me/video/upload";, {:multipart, [{:file, file, {"form-data", [name: "filedata", filename: Path.basename(file)]}, []}]}, ["AccessToken": "XXXXX"] )

это поможет вам?.. ссылка

person Dinesh Balasubramanian    schedule 23.05.2018
comment
Да, это то, что я в итоге использовал. Спасибо Динеш. См. мой ответ для полного фрагмента кода. - person JMurphyWeb; 24.05.2018

Следуя ответу Динеша, вот фрагмент кода, который я выбрал:

headers =
  [
    "Authorization": "bearer " <> token,
    "Content-Type": "multipart/form-data",
  ]

file_path = Ev2.Lib.MergerAPI.get_timecard_document_path
body = {:multipart, [{:file, file_path}]}
res = HTTPoison.post(url, body, headers)
person JMurphyWeb    schedule 24.05.2018