我正在尝试 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"},