使用ExAws时,出现错误(FunctionClauseError)没有匹配的函数子句::raw_file_io_raw.open_layer / 3

时间:2019-07-10 23:59:07

标签: elixir

我正在尝试 ExAws https://github.com/ex-aws/ex_aws_s3)上传到S3。我收到此错误:

** (FunctionClauseError) no function clause matching in :raw_file_io_raw.open_layer/3

在我升级到OTP 22和Elixir 1.9之前,它曾经可以工作。

我找到了这个https://github.com/elixir-lang/elixir/issues/7771,但是不确定是否仍然适用。

这是执行此操作的代码:

cloud_s3.path
|> S3.Upload.stream_file
|> S3.upload(cloud_s3.s3_bucket, cloud_s3.s3_output)
|> ExAws.request
|> case do
  {:ok, result } ->
    Logger.warn "S3: Done for #{inspect(result)}"
  _ ->
    Logger.warn "S3: Err for #{inspect(cloud_s3)}, Not sure why!}"
end

现在我注销了cloud_s3.path |> S3.Upload.stream_file,结果如下:

%File.Stream{
  line_or_bytes: 5242880,
  modes: [:raw, :raw, {:read_ahead, 65536}, :binary, :binary],
  path: "/var/folders/3m/n6p202494w15b5xx0fc15y580000gn/T//plug-1562/multipart-1562739090-118134755902720-4",
  raw: true
}

raw: true,这是我收到错误消息的原因。我不确定该如何解决。

https://hexdocs.pm/elixir/File.html#stream!/3-raw-files都可以。

我认为解决方案是我需要将raw: false传递到S3.Upload.stream_file中。但是没有选择。


这是奇怪的部分。如果我这样做:

cloud_s3.path
|> File.stream!([], 5 * 1024 * 1024)
|> S3.upload(cloud_s3.s3_bucket, cloud_s3.s3_output)
|> ExAws.request

效果很好!!!

因此,文档中的S3.Upload.stream_file函数:

@spec stream_file(path :: binary) :: File.Stream.t
@spec stream_file(path :: binary, opts :: [chunk_size: pos_integer]) :: File.Stream.t
def stream_file(path, opts \\ []) do
  File.stream!(path, [], opts[:chunk_size] || 5 * 1024 * 1024)
end

虽然差不多!

我现在很困惑。

      {:ex_aws, "~> 2.0"},
      {:ex_aws_s3, "~> 2.0"},

0 个答案:

没有答案