TIL: File Uploads Using the Req Elixir Library

• 1 min read

The Req Elixir library doesn’t support file uploads(as of version 0.4.5). Instead, you need to use multipart to construct the HTTP request before you send it.

Here is an example sending an mp3 file to the OpenAI audio transcription API(aka Whisper):

def transcribe_audio(file_path, token) do
    model = "whisper-1"
    filename = Path.basename(file_path)
    {:ok, file_contents} = File.read(file_path)

    multipart =
      Multipart.new()
      |> Multipart.add_part(Multipart.Part.text_field(model, "model"))
      |> Multipart.add_part(
        Multipart.Part.file_content_field(filename, file_contents, :file, filename: filename)
      )

    content_length = Multipart.content_length(multipart)
    content_type = Multipart.content_type(multipart, "multipart/form-data")

    headers = [
      {"authorization", "Bearer #{token}"},
      {"Content-Type", content_type},
      {"Content-Length", to_string(content_length)}
    ]

    Req.post(
      "https://api.openai.com/v1/audio/transcriptions",
      headers: headers,
      body: Multipart.body_stream(multipart)
    )
  end
Now look what you've done 🌋
Stop clicking and run for your life! 😱
Uh oh, I don't think the system can't handle it! 🔥
Stop it, you're too kind 😄
Thanks for the love! ❤️
Thanks, glad you enjoyed it! Care to share?
Hacker News Reddit

Hey 👋, thanks for reading!

I am currently looking for my next job.

If you know of someplace that might be a good fit for me, I'd really appreciate an intro: mail@samrat.me

Recommended Posts ✍🏻

See All »
• 6 min read
TIL: Sum Types With `instructor_ex`
Read Post »
• 5 min read
[Video] Testing Google Gemini Audio Capabilities
Read Post »
• 1 min read
TIL: Creating `sentence-transformers` Embedding...
Read Post »