Elixir S3上文件的File.Stream?

Elixir S3上文件的File.Stream?,elixir,Elixir,是否可以从URL流式传输文件?亚马逊S3 我试着做: stream= File.stream!(public_s3_file_path) 我得到了错误,尽管文件在那里并且是公共的: ** (File.Error) could not stream "filepath...": no such file or directory (elixir) lib/file/stream.ex:78: anonymous fn/2 in Enumerable.File.Stream.reduce/

是否可以从URL流式传输文件?亚马逊S3

我试着做:

stream= File.stream!(public_s3_file_path)
我得到了错误,尽管文件在那里并且是公共的:

** (File.Error) could not stream "filepath...": no such file or directory
    (elixir) lib/file/stream.ex:78: anonymous fn/2 in Enumerable.File.Stream.reduce/3
    (elixir) lib/stream.ex:1240: anonymous fn/5 in Stream.resource/3
    (elixir) lib/stream.ex:785: Stream.do_transform/8
    (elixir) lib/stream.ex:1403: Enumerable.Stream.do_each/4
    (elixir) lib/task/supervised.ex:216: Task.Supervised.stream_reduce/10
    (elixir) lib/stream.ex:570: Stream.run/1
    (elixir) lib/task/supervised.ex:85: Task.Supervised.do_apply/2
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
Function: &Stream.run/1
    Args: [#Function<0.55381211/2 in Task.Supervisor.build_stream/5>]
错误:

16:19:49.569 [error] Task #PID<0.168.0> started from #PID<0.165.0> terminating
** (File.Error) could not stream "https://s3.eu-central-1.amazonaws.com/trackware.staging.schools/school-2/uploads/process%3A15073648797260": no such file or directory
    (elixir) lib/file/stream.ex:78: anonymous fn/2 in Enumerable.File.Stream.reduce/3
    (elixir) lib/stream.ex:1240: anonymous fn/5 in Stream.resource/3
    (elixir) lib/stream.ex:570: Stream.run/1
    (elixir) lib/task/supervised.ex:85: Task.Supervised.do_apply/2
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
Function: &Stream.run/1
    Args: [%File.Stream{line_or_bytes: :line, modes: [:raw, :read_ahead, :binary], path: "https://s3.eu-central-1.amazonaws.com/trackware.staging.schools/school-2/uploads/process%3A15073648797260", raw: true}]
16:19:49.569[错误]任务#PID从开始#PID终止
**(File.Error)无法流式传输“https://s3.eu-central-1.amazonaws.com/trackware.staging.schools/school-2/uploads/process%3A15073648797260“:没有这样的文件或目录
(elixir)lib/file/stream.ex:78:Enumerable.file.stream.reduce/3中的匿名fn/2
(elixir)lib/stream.ex:1240:stream.resource/3中的匿名fn/5
(elixir)lib/stream.ex:570:stream.run/1
(elixir)lib/task/supervised.ex:85:task.supervised.do_apply/2
(stdlib)proc_lib.erl:247::proc_lib.init_p_do_apply/3
函数:&Stream.run/1
Args:[%File.Stream{line_或_bytes::line,模式:[:原始,:预读,:二进制],路径:https://s3.eu-central-1.amazonaws.com/trackware.staging.schools/school-2/uploads/process%3A15073648797260“,raw:true}]

有什么想法吗?也许
File.stream
仅适用于本地文件

File.stream
仅适用于本地文件。您需要一个HTTP客户端来读取HTTP服务器。例如,该包支持流式请求,其中当远程服务器向连接套接字写入内容时,通过消息将响应发送到进程。您可以在httpoison的

iex>HTTPoison.get!"https://github.com/“,%{},流_到:self
%HTTPoison.AsyncResponse{id:#Reference}
iex>刷新
%HTTPoison.AsyncStatus{code:200,id:#Reference}
%HTTPoison.AsyncHeaders{headers:%%{“Connection”=>“keep alive”,…},id:#Reference}
%HTTPoison.AsyncChunk{chunk:“…”,id:#Reference}
%HTTPoison.AsyncEnd{id:#Reference}
:好的

(httpoison自述文件中的一个示例。)

使用
httpoison
下载文件,然后使用
file.stream
进行流式传输是一个好主意吗?或者
httpoison
将返回一个流,该流可用作File.stream返回的流?还有一个名为的库,它也支持S3流AFAIK@simoHTTPoison中的流式处理请求没有实现
协议,因此它们与
File.Stream
的功能不兼容。如果文件很小,您可以执行普通请求并使用返回的字符串?或者实际文件是否比您提供的示例URL大?@JonasDellinger该库不是用来访问您自己的S3存储桶的吗?它支持来自公共S3URL的流文件吗?将
File.stream在另一个节点上处理文件?我可能会下载文件,进行流式处理,然后将其删除。。那么,从某种意义上说,S3支持获取bucket中对象的精确字节范围是可能的。因此,您可以针对连续的字节范围发出多个请求,直到获得整个文件。您可以在此处看到此方法:。查看
perform
功能。它使用GenStage workers进行并行下载。工人可能能够适应向流中喂料()。
16:19:49.569 [error] Task #PID<0.168.0> started from #PID<0.165.0> terminating
** (File.Error) could not stream "https://s3.eu-central-1.amazonaws.com/trackware.staging.schools/school-2/uploads/process%3A15073648797260": no such file or directory
    (elixir) lib/file/stream.ex:78: anonymous fn/2 in Enumerable.File.Stream.reduce/3
    (elixir) lib/stream.ex:1240: anonymous fn/5 in Stream.resource/3
    (elixir) lib/stream.ex:570: Stream.run/1
    (elixir) lib/task/supervised.ex:85: Task.Supervised.do_apply/2
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
Function: &Stream.run/1
    Args: [%File.Stream{line_or_bytes: :line, modes: [:raw, :read_ahead, :binary], path: "https://s3.eu-central-1.amazonaws.com/trackware.staging.schools/school-2/uploads/process%3A15073648797260", raw: true}]
iex> HTTPoison.get! "https://github.com/", %{}, stream_to: self
%HTTPoison.AsyncResponse{id: #Reference<0.0.0.1654>}
iex> flush
%HTTPoison.AsyncStatus{code: 200, id: #Reference<0.0.0.1654>}
%HTTPoison.AsyncHeaders{headers: %{"Connection" => "keep-alive", ...}, id: #Reference<0.0.0.1654>}
%HTTPoison.AsyncChunk{chunk: "<!DOCTYPE html>...", id: #Reference<0.0.0.1654>}
%HTTPoison.AsyncEnd{id: #Reference<0.0.0.1654>}
:ok