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)Исходный код
@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()}
© 2014 Chris McCord
Licensed under the MIT License.
https://phoenix-live-view.hexdocs.pm/Phoenix.LiveView.UploadWriter.html