también - Elixir-Descargar un archivo(imagen) desde una URL
elixir sinonimo (2)
El método de descarga proporcionado por @whatyouhide funciona pero tiene inconvenientes:
- Toda la respuesta se está cargando en la RAM, y solo después de eso se va a
File.write/1
. Tiene que elegir la solicitud asíncrona HTTPoison para escapar del alto consumo de memoria. - No hay restricción del tamaño del archivo a descargar. Si maneja, dice, la entrada del usuario y luego intenta descargar cualquier archivo provisto por el usuario, su servidor puede descargar un archivo que tiene un tamaño de 1 TB.
Creé el paquete de download elixir para evitar estos inconvenientes.
Tiene buena sintaxis y bien probado. Sólo tipo
Download.from(url, [path: "/where/to/save", max_file_size: integer_in_bytes])
¿Cómo se ve el código para descargar un archivo / imagen de una URL en Elixir?
Las búsquedas en Google parecen traer de vuelta cómo descargar el propio Elixir.
Eche un vistazo a httpoison , un cliente HTTP para Elixir. Simplemente puede emitir una solicitud GET
a la URL que apunta a la imagen (o archivo, es irrelevante):
%HTTPoison.Response{body: body} = HTTPoison.get!("http://example.com/img.png")
HTTPoison.get!/1
devuelve una estructura HTTPoison.Response
; Coincidí en esa estructura para obtener el cuerpo de la respuesta. Ahora las variables del body
contienen los datos de la imagen (que es solo un binario); Puedes escribirlo en un archivo:
File.write!("/tmp/image.png", body)
y hay que ir :).
Obviamente, esto es posible incluso sin usar httpoison, pero tendría que lidiar con las conexiones TCP sin procesar (mire el módulo de Erlang gen_tcp
), analizando la respuesta HTTP y un montón de cosas que normalmente no quiere hacer manualmente.
Vaya, olvidé mencionar el módulo httpc
Erlang (incluido en el stdlib!), Lo que lo hace muy simple sin la necesidad de una dependencia como HTTPoison:
Application.ensure_all_started :inets
{:ok, resp} = :httpc.request(:get, {''http://example.com/my_image.jpg'', []}, [], [body_format: :binary])
{{_, 200, ''OK''}, _headers, body} = resp
File.write!("/tmp/my_image.jpg", body)