Search documentation of phoenix_kit

# PhoenixKit.Storage.File (phoenix_kit v1.6.19)

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.)
- `file_checksum` - SHA256 hash of file content for integrity verification
- `user_file_checksum` - SHA256 hash of (user_id + file_checksum) for per-user deduplication
- `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",
      file_checksum: "abc123def456...",
      user_file_checksum: "xyz789ghi012...",
      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",
      file_checksum: "def456ghi789...",
      user_file_checksum: "mno345pqr678...",
      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",
      file_checksum: "ghi789jkl012...",
      user_file_checksum: "stu901vwx234...",
      size: 2_097_152,  # 2 MB
      status: "active"
    }

# Summary

## Types

t()

## Functions

archive?(arg1)

Returns whether this file is an archive.

changeset(file, attrs)

Changeset for creating or updating a file.

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.

# Types

# t()

    @type t() :: %PhoenixKit.Storage.File{
      __meta__: term(),
      duration: integer() | nil,
      ext: String.t(),
      file_checksum: 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_file_checksum: String.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`
- `file_checksum`
- `user_file_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.