File
The file input type is used for uploading and managing files. It supports both single file and multiple file uploads with preview capabilities, download functionality, and file deletion.
Properties
Required Properties
- name (string): Unique identifier for the field
- type (string): Must be 'file'
- label (string): Display label for the field
Optional Properties
- multiple (boolean): Whether to allow multiple file selection (default: false)
- placeholder (string): Placeholder text for the upload area
- colSpan (number): Number of columns for grid layout
- disabled (boolean): Whether the field is disabled
- layout (string): Layout type (default, horizontal)
- rules (array): Validation rules for the field
Examples
Single File Upload
typescript
{
name: 'profileImage',
type: 'file',
label: 'Profile Image',
placeholder: 'Upload your profile image',
rules: ['required']
}
Multiple File Upload
typescript
{
name: 'gallery',
type: 'file',
label: 'Photo Gallery',
placeholder: 'Upload multiple photos',
multiple: true,
rules: ['required']
}
File Upload with Type Validation
typescript
{
name: 'document',
type: 'file',
label: 'Upload Document',
placeholder: 'Upload PDF or Word document',
rules: [
'required',
{
type: 'custom',
function: '(value) => {
if (!value) return true;
const allowedTypes = ["application/pdf", "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"];
const file = document.querySelector("input[type=file]")?.files?.[0];
return file ? allowedTypes.includes(file.type) : true;
}',
message: 'Please upload a PDF or Word document'
}
]
}
File Upload with Size Validation
typescript
{
name: 'largeFile',
type: 'file',
label: 'Upload Large File',
placeholder: 'Upload file (max 10MB)',
rules: [
'required',
{
type: 'custom',
function: '(value) => {
if (!value) return true;
const file = document.querySelector("input[type=file]")?.files?.[0];
return file ? file.size <= 10 * 1024 * 1024 : true;
}',
message: 'File size must be less than 10MB'
}
]
}
Complex Form with File Uploads
typescript
const schema = [
{
name: 'firstName',
type: 'text',
label: 'First Name',
placeholder: 'Enter your first name',
rules: ['required'],
},
{
name: 'lastName',
type: 'text',
label: 'Last Name',
placeholder: 'Enter your last name',
rules: ['required'],
},
{
name: 'email',
type: 'text',
label: 'Email',
placeholder: 'Enter your email',
rules: ['required', 'email'],
},
{
name: 'profileImage',
type: 'file',
label: 'Profile Image',
placeholder: 'Upload your profile image',
rules: ['required'],
},
{
name: 'documents',
type: 'file',
label: 'Supporting Documents',
placeholder: 'Upload supporting documents',
multiple: true,
rules: [],
},
{
name: 'portfolio',
type: 'file',
label: 'Portfolio Images',
placeholder: 'Upload portfolio images',
multiple: true,
rules: [],
},
];
File Upload with Specific File Types
typescript
const schema = [
{
name: 'imageUpload',
type: 'file',
label: 'Image Upload',
placeholder: 'Upload image files only',
rules: [
'required',
{
type: 'custom',
function: '(value) => {
if (!value) return true;
const allowedTypes = ["image/jpeg", "image/png", "image/gif", "image/webp"];
const file = document.querySelector("input[type=file]")?.files?.[0];
return file ? allowedTypes.includes(file.type) : true;
}',
message: 'Please upload an image file (JPEG, PNG, GIF, WebP)'
}
]
},
{
name: 'videoUpload',
type: 'file',
label: 'Video Upload',
placeholder: 'Upload video files only',
rules: [
{
type: 'custom',
function: '(value) => {
if (!value) return true;
const allowedTypes = ["video/mp4", "video/avi", "video/mov", "video/wmv"];
const file = document.querySelector("input[type=file]")?.files?.[0];
return file ? allowedTypes.includes(file.type) : true;
}',
message: 'Please upload a video file (MP4, AVI, MOV, WMV)'
}
]
}
];
Validation Rules
Common File Validation Patterns
typescript
// Required file upload
{
type: 'required',
message: 'Please upload a file'
}
// File type validation
{
type: 'custom',
function: '(value) => {
if (!value) return true;
const allowedTypes = ["image/jpeg", "image/png", "image/gif"];
const file = document.querySelector("input[type=file]")?.files?.[0];
return file ? allowedTypes.includes(file.type) : true;
}',
message: 'Please upload an image file (JPEG, PNG, GIF)'
}
// File size validation (5MB limit)
{
type: 'custom',
function: '(value) => {
if (!value) return true;
const file = document.querySelector("input[type=file]")?.files?.[0];
return file ? file.size <= 5 * 1024 * 1024 : true;
}',
message: 'File size must be less than 5MB'
}
// Multiple file count validation
{
type: 'custom',
function: '(value) => {
if (!value) return true;
const files = document.querySelector("input[type=file]")?.files;
return files ? files.length <= 5 : true;
}',
message: 'Please upload no more than 5 files'
}
// File extension validation
{
type: 'custom',
function: '(value) => {
if (!value) return true;
const file = document.querySelector("input[type=file]")?.files?.[0];
if (!file) return true;
const allowedExtensions = [".pdf", ".doc", ".docx"];
const fileExtension = "." + file.name.split(".").pop().toLowerCase();
return allowedExtensions.includes(fileExtension);
}',
message: 'Please upload a PDF or Word document'
}
// Conditional file validation
{
type: 'custom',
function: '(value, formValues) => {
if (formValues.accountType === "business") {
return value && value.length > 0;
}
return true;
}',
message: 'Business accounts must upload a company document'
}
Best Practices
- Use clear, descriptive labels for file upload fields
- Specify file type restrictions to prevent invalid uploads
- Set appropriate file size limits to prevent server overload
- Provide helpful placeholder text explaining what files are expected
- Use multiple file upload for galleries, portfolios, and document collections
- Implement proper validation for file types, sizes, and counts
- Show file previews for better user experience
- Provide download and delete functionality for uploaded files
- Use consistent styling across your application
- Consider accessibility with proper labels and keyboard navigation
- Test with different file types and sizes
- Provide clear error messages for validation failures
- Handle upload progress for large files
- Implement file compression for images when appropriate
- Use secure file handling to prevent malicious uploads