5.9 KiB
Media Selection Upload Widgets
Overview
The MediaSelection node now features interactive upload widgets that provide a user-friendly way to upload images and videos directly through the ComfyUI interface when using "Upload Media" mode.
Features
Dynamic Upload Buttons
- 📁 Choose Image: Appears when
media_typeis set to "image" - 📹 Choose Video: Appears when
media_typeis set to "video" - Smart Visibility: Only the relevant upload button is shown based on media type selection
ComfyUI Integration
- Uses ComfyUI's built-in upload system (
api.uploadImage()and upload endpoints) - Proper file handling and storage in ComfyUI's input directory
- Seamless integration with existing ComfyUI workflow system
User Experience
- Click-to-upload: Simple button interface that opens file browser
- Visual Feedback: Button text updates to show selected filename
- File Type Filtering: File browser only shows relevant file types (images or videos)
- Error Handling: Clear feedback if upload fails
Implementation Details
Upload Process
- File Selection: User clicks upload button → file browser opens
- File Upload: Selected file is uploaded using ComfyUI's upload API
- Path Storage: Uploaded file path is stored in the appropriate widget
- UI Update: Button text updates to show selected filename
- Node Refresh: Node is marked as changed to trigger workflow updates
File Handling
Images
- Uses
api.uploadImage(file)for proper image handling - Supports all standard image formats (PNG, JPG, WebP, etc.)
- Stored in ComfyUI's input directory
Videos
- Uses general upload endpoint (
/upload/image) with video files - Supports common video formats (MP4, AVI, MOV, etc.)
- Proper MIME type handling for video files
Widget State Management
The upload widgets work by converting the original text input widgets into interactive buttons:
// Convert text widget to upload button
originalUploadedImageWidget.type = 'button';
originalUploadedImageWidget.value = '📁 Choose Image';
originalUploadedImageWidget.callback = uploadHandler;
Backend Integration
The uploaded file paths are stored in the hidden text widgets that the Python backend expects:
uploaded_image_file: Contains the path to uploaded imageuploaded_video_file: Contains the path to uploaded video
Usage Guide
For Image Upload
- Set
media_sourceto "Upload Media" - Set
media_typeto "image" - Click the "📁 Choose Image" button
- Select an image file from your computer
- Button updates to show "📁 [filename]"
- File is ready for processing
For Video Upload
- Set
media_sourceto "Upload Media" - Set
media_typeto "video" - Click the "📹 Choose Video" button
- Select a video file from your computer
- Button updates to show "📹 [filename]"
- File is ready for processing
Dynamic Switching
You can switch between image and video upload by changing the media_type dropdown:
- Image → Video: Image upload button becomes hidden, video upload button appears
- Video → Image: Video upload button becomes hidden, image upload button appears
Technical Implementation
JavaScript Widget Code
The upload functionality is implemented in the MediaSelection node's JavaScript widget code:
// Show image upload widget
if (mediaType === 'image') {
originalUploadedImageWidget.type = 'button';
originalUploadedImageWidget.value = '📁 Choose Image';
originalUploadedImageWidget.callback = () => {
const input = document.createElement('input');
input.type = 'file';
input.accept = 'image/*';
input.onchange = async (e) => {
const file = e.target.files[0];
if (file) {
const uploadResponse = await api.uploadImage(file);
originalUploadedImageWidget.value = `📁 ${file.name}`;
// Store path in hidden widget for backend
hiddenImageWidget.value = uploadResponse.name;
}
};
input.click();
};
}
Error Handling
- Upload Failures: Button shows "Upload Failed" if upload encounters errors
- File Size Limits: Respects ComfyUI's maximum upload size settings
- Network Issues: Handles connection errors gracefully
- Invalid Files: File type validation prevents unsupported formats
Browser Cache Note
Important: After deploying this JavaScript update, users may need to:
- Hard refresh the browser (Ctrl+F5 / Cmd+Shift+R)
- Clear browser cache
- Restart ComfyUI server to ensure new JavaScript is loaded
Testing
Manual Testing Steps
-
Upload Image Test:
- Set media_source to "Upload Media" and media_type to "image"
- Verify "📁 Choose Image" button appears
- Click button and select an image file
- Verify button updates with filename
- Execute workflow to confirm file processing
-
Upload Video Test:
- Set media_source to "Upload Media" and media_type to "video"
- Verify "📹 Choose Video" button appears
- Click button and select a video file
- Verify button updates with filename
- Execute workflow to confirm file processing
-
Dynamic Switching Test:
- Start with image upload, then switch to video upload
- Verify only appropriate upload button is visible
- Test switching back to image upload
Debug Console
Enable debug mode to see detailed console output:
[MediaSelection] Showing image upload widget
[MediaSelection] Image file selected: example.jpg
[MediaSelection] Image uploaded: {name: "example.jpg", ...}
Related Files
web/js/swiss-army-knife.js- JavaScript widget implementationnodes/media_selection/media_selection.py- Python backend nodedocs/nodes/media-selection/MEDIA_SELECTION.md- Complete node documentation
Category: UI Enhancement Status: Implemented Version: 2.5.6+