从URL下载文件/图像的代码在Elixir中是什么样的?
谷歌搜索似乎带回了如何下载Elixir本身。
答案 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提供的下载方法有效但有缺点:
File.write/1
。您必须选择异步HTTPoison请求以逃避高内存消耗。我创建了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。