URLからファイル/画像をダウンロードするコードはElixirではどのように見えますか?
グーグル検索はエリクサー自体をダウンロードする方法を取り戻すようです。
ElixirのHTTPクライアントである httpoison をご覧ください。画像(またはファイル、それは無関係)を指すURLに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)
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を超えないことを示しました。一重引用符で囲まれた文字列に注意してください。このErlangライブラリにElixir文字列を渡すことはできません。
@whatyouhideが提供するダウンロード方法は機能しますが、欠点があります。
File.write/1
に送られます。高いメモリ消費を回避するには、非同期HTTPoison要求を選択する必要があります。これらの短所を回避するために ダウンロード エリクサーパッケージを作成しました。
それは素晴らしい構文を持ち、十分にテストされています。入力するだけです
Download.from(url, [path: "/where/to/save", max_file_size: integer_in_bytes])