Я получаю сообщение об ошибке (FunctionClauseError), когда не найдено ни одного совпадения функционального предложения в: raw_file_io_raw.open_layer / 3 при использовании ExAws - PullRequest
0 голосов
/ 11 июля 2019

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