Stream a downloaded file with Phoenix and Req

I had to proxy files from an S3 bucket hosted on Tigris because some ISPs are blocking the domain fly.storage.tigris.dev, as it was previously used to distribute malware.

The code

def show(conn, %{ "id" => document_id }) do case Documents.get_document_by(id: document_id) do document when is_map(document) -> s3_url = Documents.get_s3_url(document) conn = conn # I'm serving pdf only but adapt for your use case |> put_resp_content_type("application/pdf") # Send the response in chunks |> send_chunked(200) # Perform the request to the S3 url # We use `into: fn ... end` to capture the streamed data # immediately pass it to the client with `chunk/2` Req.get!(s3_url, into: fn {:data, data}, {req, resp} -> chunk(conn, data) {:cont, {req, resp}} end ) conn nil -> conn |> put_status(404) |> render("404.html") end end

Stay up to date

Sign up for the mailing list and get notified via email when new blog posts come out.