PhoenixKit.Storage.File (phoenix_kit v1.5.1)

View Source

Schema for original file uploads.

Represents the original uploaded file with metadata. Each file can have multiple instances (variants) like thumbnails, resizes, or video quality variants.

File Types

  • image - JPEG, PNG, WebP, GIF, HEIC (scalable)
  • video - MP4, WebM, MOV, AVI, MKV (scalable)
  • document - PDF, DOC, DOCX, TXT, MD (non-scalable)
  • archive - ZIP, RAR, 7Z, TAR, GZ (non-scalable)

Status Flow

  • processing - File is being processed (variants being generated)
  • active - File is ready and available
  • failed - Processing failed

Fields

  • original_file_name - User's original filename
  • file_name - System filename (uuid_v7-original.ext)
  • mime_type - MIME type (image/jpeg, video/mp4, etc.)
  • file_type - High-level type (image, video, document, archive)
  • ext - File extension (jpg, mp4, pdf, etc.)
  • checksum - MD5 or SHA256 hash for integrity verification
  • size - File size in bytes
  • width - Image/video width in pixels (nullable)
  • height - Image/video height in pixels (nullable)
  • duration - Video duration in seconds (nullable)
  • status - Processing status
  • metadata - JSONB with EXIF, codec info, etc.
  • user_id - Owner of the file

Examples

# Image file
%File{
  id: "018e3c4a-9f6b-7890-abcd-ef1234567890",
  original_file_name: "profile.jpg",
  file_name: "018e3c4a-9f6b-7890-original.jpg",
  mime_type: "image/jpeg",
  file_type: "image",
  ext: "jpg",
  checksum: "abc123def456...",
  size: 524_288,  # 512 KB
  width: 2000,
  height: 2000,
  status: "active",
  metadata: %{"camera" => "Canon EOS"},
  user_id: "..."
}

# Video file
%File{
  original_file_name: "intro.mp4",
  file_name: "018e3c4a-9f6b-7890-original.mp4",
  mime_type: "video/mp4",
  file_type: "video",
  ext: "mp4",
  size: 10_485_760,  # 10 MB
  width: 1920,
  height: 1080,
  duration: 30,  # 30 seconds
  status: "processing",
  metadata: %{"codec" => "h264"}
}

# Document file
%File{
  original_file_name: "report.pdf",
  file_name: "018e3c4a-9f6b-7890-original.pdf",
  mime_type: "application/pdf",
  file_type: "document",
  ext: "pdf",
  size: 2_097_152,  # 2 MB
  status: "active"
}

Summary

Functions

Returns whether this file is an archive.

Changeset for creating or updating a file.

Returns whether this file is a document.

Returns whether this file is an image.

Returns whether this file type supports variant generation (scalable).

Returns whether this file is a video.

Types

t()

@type t() :: %PhoenixKit.Storage.File{
  __meta__: term(),
  checksum: String.t(),
  duration: integer() | nil,
  ext: String.t(),
  file_name: String.t(),
  file_path: String.t() | nil,
  file_type: String.t(),
  height: integer() | nil,
  id: UUIDv7.t() | nil,
  inserted_at: NaiveDateTime.t() | nil,
  instances:
    [PhoenixKit.Storage.FileInstance.t()] | Ecto.Association.NotLoaded.t(),
  metadata: map() | nil,
  mime_type: String.t(),
  original_file_name: String.t(),
  size: integer(),
  status: String.t(),
  updated_at: NaiveDateTime.t() | nil,
  user: PhoenixKit.Users.Auth.User.t() | Ecto.Association.NotLoaded.t(),
  user_id: integer() | nil,
  width: integer() | nil
}

Functions

archive?(arg1)

Returns whether this file is an archive.

changeset(file, attrs)

Changeset for creating or updating a file.

Required Fields

  • original_file_name
  • file_name
  • mime_type
  • file_type (must be: "image", "video", "document", "archive")
  • ext
  • checksum
  • size
  • user_id

Validation Rules

  • File type must be valid
  • Status must be valid (processing, active, failed)
  • Size must be positive
  • Width/height must be positive (if provided)
  • Duration must be positive (if provided)

document?(arg1)

Returns whether this file is a document.

image?(arg1)

Returns whether this file is an image.

scalable?(arg1)

Returns whether this file type supports variant generation (scalable).

video?(arg1)

Returns whether this file is a video.