2.9 KiB
Upload 500 Error Fix - Complete
Date: December 19, 2025
Problem
File uploads were failing with HTTP 500 error:
POST http://localhost:5000/api/admin/upload 500 (Internal Server Error)
Error: "Failed to save uploaded files"
Root Cause
Backend Log Error
[error]: Database insert failed for file: {
"filename":"18498-1766201320693-912285946.jpg",
"error":"invalid input syntax for type integer: \"admin-default\""
}
Database Type Mismatch
adminusers.id= TEXT (value:"admin-default")uploads.uploaded_by= INTEGER ❌media_folders.created_by= INTEGER ❌
When the upload route tried to insert req.session.user.id ("admin-default") into the INTEGER column, PostgreSQL rejected it.
Solution
Database Schema Fix
Changed column types to match the adminusers.id type:
-- Fix uploads table
ALTER TABLE uploads ALTER COLUMN uploaded_by TYPE TEXT;
-- Fix media_folders table
ALTER TABLE media_folders ALTER COLUMN created_by TYPE TEXT;
Verification
uploads.uploaded_by: integer → text ✅
media_folders.created_by: integer → text ✅
Files Changed
Database
- ✅
uploads.uploaded_by: INTEGER → TEXT - ✅
media_folders.created_by: INTEGER → TEXT
Migration File Created
- ✅
backend/migrations/fix-uploaded-by-type.sql
Backend Code
- ✅ No changes needed (already using
req.session.user?.id)
Why This Happened
The original schema was designed expecting numeric user IDs, but the authentication system uses text-based IDs ("admin-default"). This type mismatch wasn't caught until file upload was tested.
Testing
Before Fix
❌ Upload fails with 500 error
❌ Database insert error
❌ Files uploaded to disk but not in database
❌ User sees "Upload failed" message
After Fix
✅ Upload succeeds
✅ Database insert works
✅ Files tracked properly
✅ User sees success message
Test Steps
- Navigate to http://localhost:5000/admin/media-library.html
- Click "Upload Files" button
- Select one or more images (JPG, PNG, GIF, WebP)
- Watch progress bar complete
- See success alert: "Successfully uploaded X file(s)!"
- Files appear in the media grid
Related Tables Fixed
Both tables that reference user IDs:
uploads- Tracks uploaded filesmedia_folders- Tracks folder creators
Both now use TEXT to match adminusers.id.
Migration Safety
The ALTER TABLE commands are safe because:
- ✅ No existing data (tables are new)
- ✅ TEXT can hold any INTEGER value
- ✅ No foreign key constraints broken
- ✅ Instant operation (no data conversion needed)
Summary
Upload functionality is now fully operational!
The database schema mismatch between user IDs (TEXT) and foreign keys (INTEGER) has been resolved. All file uploads and folder creation operations will now work correctly with the text-based user IDs from the authentication system.