Besto
HTTPoison POST multipart with more form than the file
I’m trying to build a function to send a file through a POST request in multipart format, using this as guide, but HTTPoison keeps giving me two errors no matter what changes I make to the form. They are all
HTTPoison.post("https://api.telegram.org/myCredentials", {:multipart, form}, headers)
and the versions of my form and the errors are the following (whether I use headers or not):
1st and 2nd Version (same error for both):
form = [{"photo", [{"name", "myphoto.jpg"}, {:file, "files/aphoto.jpg"}]}, {"chat_id", 237799110}]
-----
form = [photo: [{"name", "myphoto.jpg"}, {:file, "files/aphoto.jpg"}], chat_id: 237799110]
Which give me this error:
** (FunctionClauseError) no function clause matching in anonymous fn/2 in :hackney_multipart.len_mp_stream/2
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney_multipart.erl:159: anonymous fn({"photo", [{"name", "myphoto.jpg"}, {:file, "files/aphoto.jpg"}]}, 0) in :hackney_multipart.len_mp_stream/2
(stdlib) lists.erl:1263: :lists.foldl/3
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney_multipart.erl:159: :hackney_multipart.len_mp_stream/2
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney_request.erl:319: :hackney_request.handle_body/4
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney_request.erl:81: :hackney_request.perform/2
(hackney) c:/Users/venta/projects/elixir/wrapper/deps/hackney/src/hackney.erl:373: :hackney.send_request/2
(httpoison) lib/httpoison/base.ex:432: HTTPoison.Base.request/9
I checked the code for Hackney and the line that is erroring out is one that is supposed to get the file and an accSize, but it gets passed the whole form, not the file, and Hackney can’t do anything with it. I’m wondering how to pass a form with a file inside, since the API I’m using requires that the file be inside a “photo” object as such: {“chat_id”: someid, “photo”: file_in_multipart/form-data, “otherkeys”: othervals}
Most Liked
swelham
I have also been battling with a multipart post recently and I have ended up with this as the solution which should hopefully help you out.
data = [
{"to", to},
{"subject", subject},
{"text", render_template("#{template}.text", data)},
{"html", render_template("#{template}.html", data)},
{:file, "/some/file.jpg",
{"form-data", [{"name", "inline"}, {"filename", "some-file-name.jpg"}]},
[{"Content-Type", "image/jpg"}]
}
]
This is what my data structure ends up looking like before being passed into HTTPoison like so
HTTPoison.post!("url", {:multipart, data})
I hope this helps in some form or another.
Besto
Sorry, I deleted half the code that was irrelevant and added a commetary at the end. How would you put that file inside a nested form?
Edit: and it does help. I can see a pattern. I’ll try some more with it.
Edit2: I’ll do some testing with nodejs where I have managed to send multipart files to the API, see the response it gives using netcat and see if I can reproduce that with elixir using some way around the nesting, which is what seems to be stopping HTTPoison from working.
bibblyb
Sorry to bump an old thread, I’m sure the original poster figured it out, gave up, or moved onto something else, but in case anyone is interested/finds it useful, I believe this is the code he needs:
form = [
{
:file,
"files/aphoto.jpg",
{"form-data", [{"name", "photo"}, {"filename", "myphoto.jpg"}]},
[] # pass along empty ExtraHeaders
},
{"chat_id", "237799110"}
]
HTTPoison.post("https://api.telegram.org/myCredentials", {:multipart, form}, headers)
The important part for providing a custom name to your file parameter within the form is the “name” param of “form-data”, as well as passing the empty ExtraHeaders param to ensure when creating the header for the file we go straight here:
Otherwise it will create default Content-Disposition form-data attributes:
https://github.com/benoitc/hackney/blob/e6d84f40a4d2d650659ac54dba99c0bcbbb86af4/src/hackney_multipart.erl#L226-L231
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









