WordPress User Cannot Upload Media - Permissions Fix
You click "Add Media" in WordPress.
You select an image file.
You hit upload.
And then nothing happens. Or you see one of these:
- "HTTP Error"
- "403 Forbidden"
- "File exceeds maximum upload size"
- "Sorry, you don't have permission to upload files"
- "Uploads are not allowed"
- Upload progress bar hangs at 95%
- No error message, just silently fails
Media uploads are broken. Users can't add images. Blog posts sit incomplete. The whole publishing workflow stops.
A client experienced this with their WordPress multisite. Guest contributors could upload images yesterday. Today, all uploads fail with no error message.
Turned out the hosting provider ran out of disk space during a routine backup. The uploads folder couldn't write files anymore. Every upload attempt failed silently.
Media upload failures happen for very specific reasons. Most are permissions-related. Some are configuration. But they all have fixes.
Why Media Uploads Fail
Understanding the cause narrows your troubleshooting significantly.
- Folder permissions wrong: wp-content/uploads folder isn't writable
- File permissions wrong: Individual files can't be created
- Disk space full: No space left on server for new files
- Upload size limit: File is larger than PHP or server allows
- MIME type blocked: File type (jpg, png, etc.) is forbidden
- User doesn't have permission: User role can't upload media
- Plugin conflict: A plugin is blocking uploads
- Memory limit too low: Processing the image exceeds PHP memory
- Timeout: Upload takes too long and times out
- Database error: Can't save upload metadata to database
Step 1: Check User Permissions First
Before checking server issues, verify the user has permission to upload.
Check user role
- Log in as an admin
- Go to Users
- Click the user who can't upload
- Look at "Role"
- Check what it's set to
Roles that can upload media
| User Role | Can Upload Media? | Notes |
|---|---|---|
| Administrator | Yes | Full permissions |
| Editor | Yes | Can upload and manage |
| Author | Yes (usually) | Can upload but can't manage others' uploads |
| Contributor | No (by default) | Can't upload or manage media |
| Subscriber | No | Viewing only |
| Custom Role | Depends | Check if "upload_files" capability is assigned |
Fix: Give user upload permission
- Go to Users > [User name]
- Change Role to "Author" or "Editor"
- Click "Update User"
- Have the user try uploading again
If custom role, add upload capability
- Install "User Role Editor" plugin (free)
- Go to Users > User Role Editor
- Select the custom role
- Check the "upload_files" capability
- Click "Update Role"
Step 2: Check wp-content/uploads Folder Permissions
This is the most common cause. The uploads folder isn't writable by the web server.
Check folder permissions via FTP
- Connect via FTP
- Navigate to wp-content/
- Right-click on the "uploads" folder
- Select "File Permissions" or "Properties"
- Check the permissions number (usually shown in octal, like 755 or 777)
Correct upload folder permissions
The uploads folder should be writable. The correct permission is 755 or 775.
| Permission | Readable? | Writable? | Usable for Uploads? |
|---|---|---|---|
| 755 | Yes | No (web server often can't write) | Sometimes |
| 775 | Yes | Yes (recommended) | Yes |
| 777 | Yes | Yes (but insecure) | Yes |
| 644 | Yes | No | No |
Fix folder permissions via FTP
- Right-click "uploads" folder
- Click "File Permissions" or "Properties"
- Change permission to 775
- Apply recursively (to all files inside)
- Save
- Try uploading again
Fix via SSH/Terminal
chmod -R 775 wp-content/uploads
Fix via cPanel File Manager
- Log into cPanel
- Go to File Manager
- Navigate to wp-content/uploads
- Right-click > Change Permissions
- Set to 775
- Check "Recurse into subdirectories"
- Click "Change Permissions"
Step 3: Check Disk Space
If your server has no disk space, you can't upload anything.
Check disk usage via cPanel
- Log into cPanel
- Go to "Disk Space Usage"
- Check if you're at or near 100%
Check disk usage via SSH
df -h
Look for your WordPress partition. If Usage% is 100%, you're full.
If disk is full
- Delete old backups (ask hosting first)
- Empty trash/recycle bin
- Delete unused plugins and themes
- Move old media to external storage
- Compress old database backups
- Contact hosting to upgrade disk space
Most hosting providers give you 24 hours to free up space before suspending the account.
Step 4: Check PHP Upload Size Limits
PHP has maximum file size limits. If your image exceeds these, upload fails.
Check current limits in WordPress
- Log in to wp-admin
- Go to Media
- Under the upload area, you'll see "Maximum upload file size: XXX MB"
- That's your current limit
Common upload size issues
| Limit | Common Default | Usually OK For |
|---|---|---|
| upload_max_filesize | 2MB or 8MB | Small images only |
| post_max_size | 8MB or 16MB | Small images and files |
| max_execution_time | 30 seconds | Quick uploads only |
Increase upload limits via wp-config.php
- Connect via FTP
- Open wp-config.php
- Add these lines BEFORE "That's all, stop editing!":
define( 'WP_MEMORY_LIMIT', '256M' ); define( 'WP_MAX_MEMORY_LIMIT', '512M' ); @ini_set( 'upload_max_filesize', '128M' ); @ini_set( 'post_max_size', '128M' ); - Save and upload
- Go back to Media
- Check if "Maximum upload file size" has increased
If that doesn't work, use .htaccess
Add this to your .htaccess file (in WordPress root):
php_value upload_max_filesize 128M
php_value post_max_size 128M
php_value max_execution_time 300
If still not working, contact hosting
Some hosting providers cap upload sizes at the server level. Contact them and ask for the limit to be raised to at least 64MB.
Step 5: Check MIME Type Restrictions
WordPress blocks certain file types by default. Some file types are blocked for security.
Which file types are allowed by default
- Images: jpg, jpeg, png, gif, webp
- Documents: pdf, doc, docx, xls, xlsx, ppt, pptx
- Audio: mp3, m4a, ogg, wav
- Video: mp4, mov, wmv, avi, webm
File types blocked by default
- Executables (.exe, .bat, .com)
- Scripts (.php, .php3, .php5, .phtml, .phps)
- Archives (.zip, .rar, .7z) ā usually blocked
- SVG files ā sometimes blocked
Add file type permission via plugin
- Install "Custom Post Type UI" or "File Manager"
- Go to Settings > Media
- Some plugins add a "Allowed File Types" option
- Add your file type (e.g., svg, zip)
- Save
Add file type via code
Add this to your theme's functions.php:
add_filter( 'upload_mimes', function( $mimes ) {
$mimes['svg'] = 'image/svg+xml';
$mimes['zip'] = 'application/zip';
return $mimes;
} );
Step 6: Check for Plugin Conflicts
A plugin might be intercepting or blocking uploads.
Test with plugins disabled
- Log in to wp-admin
- Go to Plugins > Installed Plugins
- Deactivate all plugins (there's a bulk action dropdown)
- Try uploading media
- If it works, a plugin was blocking uploads
- Reactivate plugins one at a time to find the culprit
Common plugins that conflict with uploads
- Security plugins: Wordfence, iThemes Security (too restrictive)
- Image optimization: Smush, ShortPixel (timeout during processing)
- Custom file handlers: Any plugin that rewrites upload logic
- Backup plugins: UpdraftPlus, Backup (if running during upload)
Tip: Check plugin settings for "disable on media upload" or "whitelist upload folder" options.
Step 7: Check Memory Limits
Processing large images requires memory. If WordPress runs out of memory, uploads fail.
Check PHP memory limit
- Log in to wp-admin
- Go to Tools > Site Health
- Look for "PHP memory limit"
- It should show something like "128M" or "256M"
Increase memory limit via wp-config.php
- Open wp-config.php
- Add this line:
define( 'WP_MEMORY_LIMIT', '256M' ); - Save and upload
- Go back to Site Health
- Refresh and check if memory limit increased
If that doesn't work, increase via .htaccess
php_value memory_limit 256M
If still failing, contact hosting
Some hosting restricts memory per request. Ask them: "Can you increase the PHP memory limit to 256MB for my account?"
Step 8: Check Upload Progress Handler
The upload progress handler sometimes conflicts with certain servers.
Disable upload progress handler
- Add this to wp-config.php:
define( 'WP_DISABLE_FATAL_ERROR_HANDLER', true ); - Save and upload
- Try uploading again
If that fixes it, the upload handler was conflicting with your server setup.
Step 9: Check Database Connection
WordPress stores upload metadata in the database. If the database can't be written to, uploads fail silently.
Test database connection
- Log in to wp-admin
- Go to Tools > Site Health
- Look for "Database" section
- It should show "Connected" or similar
If database shows error
- Check your database credentials in wp-config.php
- Make sure they're correct
- Try uploading again
If database connection is failing
Contact hosting support. Tell them: "My WordPress database connection is failing. Can you verify the database server is running and my credentials are correct?"
Step 10: Enable Debug Logging to See Actual Errors
Enable WordPress debug mode to see what's actually failing.
Enable debug logging
- Open wp-config.php via FTP
- Add these lines BEFORE "That's all, stop editing!":
define( 'WP_DEBUG', true ); define( 'WP_DEBUG_DISPLAY', false ); define( 'WP_DEBUG_LOG', true ); - Save and upload
- Try uploading media
- Download the debug.log file from wp-content/
- Search for "upload" or "media" errors
Common debug errors
| Error Message | Cause | Fix |
|---|---|---|
| "Unable to create directory" | Folder permissions wrong | chmod -R 775 wp-content/uploads |
| "Disk quota exceeded" | Disk space full | Free up disk space or upgrade |
| "Allowed memory exhausted" | Memory limit too low | Increase WP_MEMORY_LIMIT |
| "Maximum execution time exceeded" | Upload timeout | Increase max_execution_time |
| "File type not allowed" | MIME type blocked | Add to allowed MIME types |
Real-World Upload Failure Story
Scenario: A WordPress site with thousands of images had tight security. The wp-content/uploads folder had permissions set to 755. Upload was disabled. The admin couldn't figure out why.
What happened:
- Initial setup had uploads folder set to 755 (read-only)
- This worked for a few years with just the admin uploading
- Then they added contributors
- Contributors couldn't upload because the folder wasn't writable
- Admin didn't realize the permission was the issue
- Admin thought the plugin was broken
- Admin reinstalled the media plugin multiple times
Our fix:
- Checked wp-content/uploads permissions (found 755)
- Changed to 775
- Contributors immediately could upload
Why this matters: Permissions are the silent killer. They don't always show errors. They just silently fail.
Media Upload Troubleshooting Checklist
Can't upload media?
- ā Verify user has upload permission (role is Author or Editor)
- ā Check wp-content/uploads folder permissions (should be 775)
- ā Verify disk space isn't full (check in cPanel)
- ā Check maximum upload size (should be 64MB+)
- ā Verify file type is allowed (jpg, png, gif are standard)
- ā Disable all plugins and test
- ā Check PHP memory limit (should be 256MB+)
- ā Increase WP_MEMORY_LIMIT in wp-config.php
- ā Test database connection in Site Health
- ā Enable debug logging to see actual errors
- ā Try uploading from different browser/device
- ā Contact hosting if nothing works
Prevention: Keep Uploads Working
1. Monitor disk space
Set up email alerts in cPanel. Most hosting sends alerts at 80%, 90%, and 100% capacity.
2. Optimize images
Install Smush or ShortPixel. Automatically compress uploads so they take less space.
3. Archive old uploads
Don't keep years of media on the live server. Archive old posts to backup storage.
4. Set correct permissions on installation
Right after installing WordPress, set wp-content/uploads to 775 and leave it there.
5. Test uploads after site changes
After moving domains, migrating servers, or adding plugins, test media upload immediately.
6. Keep plugins updated
Image plugins especially need updates. Outdated versions conflict with newer servers.
Quick Permission Reference
Essential WordPress folder permissions
| Folder | Recommended Permission | Why |
|---|---|---|
| wp-content/uploads | 775 | Needs to be writable for media |
| wp-content/plugins | 755 | Needs to be readable, writable for installs |
| wp-content/themes | 755 | Readable, writable for updates |
| wp-config.php | 644 | Readable only (not writable) |
| .htaccess | 644 | Readable by server |
When to Contact Hosting Support
Contact them if:
- You can't access FTP or cPanel to check permissions
- Disk space shows full in cPanel
- You've increased memory and upload limits but still failing
- You need them to whitelist your file type at server level
- Site Health shows database connection errors
- You've tried all these steps and uploads still fail
What to tell them:
"WordPress media uploads are broken. I've checked folder permissions (775), increased PHP memory to 256MB, and verified disk space. Can you check if there are any server-level upload restrictions or database issues?"
Most hosting fixes this in 1-2 hours.
The Real Talk
Media upload failures feel like WordPress is broken. But they're almost always one of five things:
- Folder isn't writable (permissions)
- Disk is full (space)
- File is too big (limits)
- User can't upload (role)
- Plugin is interfering (conflict)
These are deterministic. They can always be fixed. There's no mystery here.
Start with permissions. 80% of upload failures are permission issues. Then check disk space. Then check limits. Then test with plugins disabled.
Follow this order and you'll find the problem every time.
Your media uploads will work again. You just need to know where to look.
