Spec-Zone.ru › Phoenix

Phoenix.LiveView.UploadWriter поведение

Исходный код

Предоставляет поведение для записи загруженных фрагментов в конечное место назначения.

По умолчанию файлы загружаются во временный файл на сервере, а LiveView обрабатывает их, читая временный файл или копируя его в постоянное хранилище. Для некоторых сценариев использования требуется особая обработка загруженных фрагментов, например потоковая передача загружаемого пользователем файла на другой сервер. В таких случаях мы не хотим записывать фрагменты на диск, поскольку нам нужно только переслать их.

Примечание: обработчики загрузки выполняются в процессе загрузчика канала, поэтому любая блокирующая работа блокирует канал, а ошибки приводят к аварийному завершению процесса канала.

Пользовательские реализации Phoenix.LiveView.UploadWriter можно передать в allow_upload/3. Чтобы инициализировать обработчик с параметрами, определите функцию с арностью 3, возвращающую кортеж {writer, writer_opts}. Например, представим обработчик загрузки, который записывает размеры фрагментов в журнал и отслеживает общее количество байтов, отправленных клиентом:

socket
|> allow_upload(:avatar,
  accept: :any,
  writer: fn _name, _entry, _socket -> {EchoWriter, level: :debug} end
)

Такой EchoWriter может выглядеть следующим образом:

defmodule EchoWriter do
  @behaviour Phoenix.LiveView.UploadWriter

  require Logger

  @impl true
  def init(opts) do
    {:ok, %{total: 0, level: Keyword.fetch!(opts, :level)}}
  end

  @impl true
  def meta(state), do: %{level: state.level}

  @impl true
  def write_chunk(data, state) do
    size = byte_size(data)
    Logger.log(state.level, "received chunk of #{size} bytes")
    {:ok, %{state | total: state.total + size}}
  end

  @impl true
  def close(state, reason) do
    Logger.log(state.level, "closing upload after #{state.total} bytes, #{inspect(reason)}")
    {:ok, state}
  end
end

Когда LiveView обрабатывает загруженную запись, он получает %{level: ...}, возвращённый обратным вызовом meta. Это позволяет обработчику сохранять состояние при обработке фрагментов, чтобы позднее передать его в LiveView при обработке записи.

Причины закрытия

Обратный вызов close/2 вызывается, когда загрузка завершена или отменена. Возможны следующие значения:

  • :done — клиент отправил все ожидаемые фрагменты, и загрузка ожидает обработки
  • :cancel — загрузка была отменена сервером или из-за перехода клиента на другую страницу.
  • {:error, reason} — загрузка была отменена из-за ошибки, возвращённой из write_chunk/2. Например, если write_chunk/2 возвращает {:error, :enoent, state}, загрузка будет отменена, а close/2 будет вызван с причиной {:error, :enoent}.

Краткое описание

Обратные вызовы

close(state, reason)
init(opts)
meta(state)
write_chunk(data, state)

Обратные вызовы

close(state, reason)Исходный код

@callback close(state :: term(), reason :: :done | :cancel | {:error, term()}) ::
  {:ok, state :: term()} | {:error, term()}

init(opts)Исходный код

@callback init(opts :: term()) :: {:ok, state :: term()} | {:error, term()}

meta(state)Исходный код

@callback meta(state :: term()) :: map()

write_chunk(data, state)Исходный код

@callback write_chunk(data :: binary(), state :: term()) ::
  {:ok, state :: term()} | {:error, reason :: term(), state :: term()}

Пакет Hex Предпросмотр Hex Просмотреть llms.txt Скачать версию ePub

Создано с помощью ExDoc (v0.40.3) для языка программирования Elixir

© 2014 Chris McCord
Licensed under the MIT License.
https://phoenix-live-view.hexdocs.pm/Phoenix.LiveView.UploadWriter.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API