Elixir - 从URL下载文件(图像)

时间:2015-05-15 20:11:18

标签: elixir

从URL下载文件/图像的代码在Elixir中是什么样的?

谷歌搜索似乎带回了如何下载Elixir本身。

3 个答案:

答案 0 :(得分:46)

查看httpoison,Elixir的HTTP客户端。您只需向指向图片(或文件,无关紧要)的网址发出GET请求:

%HTTPoison.Response{body: body} = HTTPoison.get!("http://example.com/img.png")

HTTPoison.get!/1返回HTTPoison.Response结构;我在该结构上匹配以获得响应的主体。现在body变量包含图像数据(只是二进制);你可以把它写到一个文件:

File.write!("/tmp/image.png", body)

然后你去:)。

即使不使用httpoison,这显然也是可能的,但您必须处理原始TCP连接(查看gen_tcp Erlang模块),解析HTTP响应以及通常的一堆内容不想手动做。

糟糕,忘了提及httpc Erlang模块(包含在stdlib中!),这使得这非常简单,不需要像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)

答案 1 :(得分:3)

@whatyouhide提供的下载方法有效但有缺点:

  • 整个响应加载到RAM,然后才转到File.write/1。您必须选择异步HTTPoison请求以逃避高内存消耗。
  • 下载文件大小没有限制。如果你处理,说,用户输入,然后你试图下载任何提供的文件,你的服务器可以下载一个1TB大小的文件。

我创建了download elixir包以绕过这些缺点。

它具有良好的语法和经过充分测试。只需输入

即可
Download.from(url, [path: "/where/to/save", max_file_size: integer_in_bytes])

答案 2 :(得分:1)

使用httpc将URL直接流式传输到文件:

:inets.start()
:ssl.start() 

{:ok, :saved_to_file} = :httpc.request(:get, {'https://elixir-lang.org/images/logo/logo.png', []}, [], [stream: '/tmp/elixir'])                     

我下载了183MB的文件,观察者显示内存使用量从未超过25MB。