Я пытаюсь нам 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"},