In this guide, you’ll learn exactly why the WordPress upload folder is not writable and how to fix it from every angle. Whether you’re dealing with a permissions error, an ownership mismatch, a corrupted upload path, or a server-level restriction, you’ll get a step-by-step solution.
By the end, you’ll be able to upload images, install plugins, and export data without ever seeing that dreaded red error message again.
Quick Fix
If you see the error “Upload folder is not writable. Export and file upload features will not be functional,” start here: go to Tools → Site Health → Info → Filesystem Permissions and check if your uploads directory is listed as Not writable.
If so, use your hosting File Manager or FTP client to set the wp-content/uploads folder permissions to 755. In most cases, this single change fixes the issue immediately.
What This Error Means
When the “Upload folder is not writable” error appears, WordPress is telling you that it cannot write new files to your server’s filesystem. This affects:
- Media uploads: You can’t add images, videos, or documents to the Media Library
- Plugin installations: WordPress can’t extract and write plugin files
- Theme uploads: You can’t install new themes via the WordPress dashboard
- Automatic updates: WordPress can’t update core, plugins, or themes automatically
- Export features: Tools like Gravity Forms or WooCommerce can’t export data
- Cache file generation: Caching plugins can’t write cache files
This error typically appears as a red notification in your WordPress dashboard or as a message when you try to upload a file: “Unable to create directory uploads/2026/08. Is its parent directory writable by the server?”
The root cause is almost always a mismatch between what WordPress expects and what your server allows. WordPress needs specific permissions to create, read, and modify files, and when those permissions are wrong, everything that involves writing files breaks.
Common Causes
Incorrect File Permissions (755/644)
The most common cause is incorrect file permissions. WordPress needs folders to be set to 755 and files to 644. If your uploads folder is set to 644 (a common mistake), WordPress can’t create new subdirectories for year/month uploads. If it’s set to 777, it may work, but it opens a massive security vulnerability.
Wrong File Ownership
Your web server runs as a specific user (like www-data on Apache/Nginx, or nobody on some shared hosts). If the uploads folder is owned by a different user (for example, your FTP account), the web server can’t write to it, even if permissions are set to 755. This is especially common after server migrations or when files are uploaded via FTP instead of WordPress itself.
Corrupted or Hard-Coded Upload Path
WordPress stores your upload path in the wp_options database table under the key upload_path. If you migrated from another host, this path may still point to the old server’s directory structure (e.g., /home/olduser/public_html/wp-content/uploads). When the path doesn’t exist on the new server, WordPress reports it as not writable, even if the actual folder has perfect permissions.
Server Disk Space Full
If your hosting account has run out of disk space, WordPress literally has nowhere to write new files. The error message is the same as a permissions issue, but no amount of permission changes will fix it until you free up space or upgrade your plan.
PHP Safe Mode or open_basedir Restrictions
Some hosts restrict PHP’s ability to access files outside a specific directory using open_basedir. If this restriction blocks WordPress from reaching the uploads folder, or if PHP Safe Mode is enabled, file operations will fail regardless of permissions.
Missing Uploads Directory
If the wp-content/uploads folder was accidentally deleted, or if it was never created during installation, WordPress has nowhere to store uploaded files. This is common on fresh installs or after manual cleanups.
WordPress Temporary Folder Full
When you upload a file, WordPress first stores it in a temporary folder on the server before moving it to wp-content/uploads. If this temp folder is full or inaccessible, the upload fails with a “not writable” error, even though the uploads folder itself is fine.
Hosting Plan Disk Limit Reached
Shared hosting plans often have strict disk space limits. If you’ve reached your quota, WordPress can’t write new files. This is different from a full server disk; it’s an account-level limit set by your host.
Mod_php vs. PHP-FPM Ownership Mismatch
If your server runs PHP as an Apache module (mod_php), the web server and PHP run as different users. This can create ownership conflicts where WordPress can read files but not write them. PHP-FPM and FastCGI configurations handle ownership more cleanly, but misconfigurations can still cause issues.
Multisite Upload Path Misconfiguration
On WordPress Multisite networks, each site gets its own subdirectory under wp-content/uploads/sites/. If the network’s upload path settings are misconfigured, or if site IDs don’t match their folder names, uploads fail for individual sites.
.htaccess Blocking Uploads
A corrupted or overly restrictive .htaccess file in your wp-content or uploads directory can block write operations or prevent PHP from executing in the uploads folder.
Plugin Conflicts (Especially Gravity Forms)
Some plugins, most notably Gravity Forms, display their own “Upload folder is not writable” message when they can’t write to the uploads directory. This message can appear even when WordPress core uploads work fine, because the plugin may be checking a specific subdirectory that doesn’t exist yet.
Before You Start
Before applying fixes, confirm the scope:
- Check Site Health: Go to Tools → Site Health → Info → Filesystem Permissions. This tells you exactly which directories are writable and which are not.
- Note recent changes: Did you migrate from another host, change hosting plans, update WordPress, or modify file permissions recently?
- Check if it’s all uploads or just one: Can you upload small images but not large ones? Can you install plugins? This helps distinguish between permissions and disk space issues.
- Back up your site: Before changing file permissions, ownership, or database values, create a full backup.
Step-by-Step Solutions
Fix 1: Check File Permissions via Site Health
This is your diagnostic starting point.
- Log into your WordPress Dashboard.
- Go to Tools → Site Health.
- Click the Info tab.
- Scroll down to Filesystem Permissions.
- Look for the Uploads directory entry.
- It should say Writable. If it says Not writable, proceed to the permission fixes below.
Fix 2: Fix Permissions via cPanel File Manager
This is the easiest method for most users.
- Log into your cPanel (or hosting control panel).
- Open File Manager.
- Navigate to
public_html/wp-content(or your WordPress root). - Find the uploads folder.
- Right-click it and select Change Permissions (or Permissions).
- Set the permissions to 755:
- Owner: Read, Write, Execute (7)
- Group: Read, Execute (5)
- Public: Read, Execute (5)
- Click Save.
- If the uploads folder contains subfolders (like
2026or08), apply 755 to those too.
Fix 3: Fix Permissions via FTP (FileZilla)
- Connect to your server via FTP/SFTP using FileZilla or your preferred client.
- Navigate to
/wp-content. - Right-click the uploads folder and select File Permissions.
- Enter 755 in the numeric value field.
- Check the box “Recurse into subdirectories” and select “Apply to directories only”.
- Click OK.
- Now right-click the uploads folder again, select File Permissions, enter 644, check “Recurse into subdirectories”, and select “Apply to files only”.
- Click OK.
Fix 4: Fix Permissions via SSH
If you have SSH access, this is the fastest and most reliable method.
- Connect to your server via SSH.
- Navigate to your WordPress directory:
cd /path/to/wordpress - Set all directories to 755:
find . -type d -exec chmod 755 {} \; - Set all files to 644:
find . -type f -exec chmod 644 {} \; - Lock down wp-config.php:
chmod 600 wp-config.php
Fix 5: Fix File Ownership via SSH
If permissions are correct but uploads still fail, ownership is the issue.
- Via SSH, check current ownership:
ls -la wp-content/uploads - If the owner is not your web server user (commonly
www-datafor Apache/Nginx on Ubuntu/Debian, orapacheon CentOS), fix it:sudo chown -R www-data:www-data /path/to/wordpress - Replace
www-datawith your actual web server user if different. Check with your host if unsure. - If you don’t have root/sudo access, contact your hosting provider and ask them to set the correct ownership.
Fix 6: Create the Uploads Directory Manually
If the uploads folder is missing entirely:
- Via File Manager or FTP, navigate to
wp-content. - Create a new folder named uploads.
- Set its permissions to 755.
- Inside uploads, create folders for the current year and month (e.g.,
2026and inside that08). - Set those folders to 755 as well.
- Test uploading a file in WordPress.
Fix 7: Clear the Hard-Coded Upload Path
After a migration, WordPress may still point to the old server’s path.
- Go to your WordPress admin and visit this URL:
yoursite.com/wp-admin/options.php - Use
Ctrl+Fto search for upload_path. - If it has a value (like an absolute server path), delete the entire value and leave the field blank.
- Also search for upload_url_path and clear its value if it contains an old URL.
- Scroll to the bottom and click Save Changes.
- WordPress will now use the default
wp-content/uploadspath.
Alternative method via phpMyAdmin:
- Log into phpMyAdmin.
- Select your WordPress database.
- Open the wp_options table.
- Find the rows named upload_path and upload_url_path.
- Edit each row and delete the value in the option_value field.
- Click Go to save.
Fix 8: Add FS_METHOD to wp-config.php
This forces WordPress to write files directly instead of using FTP credentials.
- Open
wp-config.phpin your WordPress root. - Add this line above
/* That's all, stop editing! Happy publishing. */:define('FS_METHOD', 'direct'); - Save the file.
- Also add these lines to ensure consistent permissions:
define('FS_CHMOD_DIR', 0755); define('FS_CHMOD_FILE', 0644); - Save and test uploads again.
Fix 9: Check and Free Up Disk Space
- Log into your hosting control panel and check your disk usage.
- If you’re at or near your limit:
- Delete old backups, logs, or unused media files
- Remove inactive themes and plugins
- Clear cache folders that have grown too large
- Optimize your database
- If you can’t free up enough space, upgrade your hosting plan.
Fix 10: Empty the WordPress Temporary Folder
The temp folder is not accessible via FTP; you need your host’s help.
- Contact your hosting provider’s support.
- Ask them to check and clear the PHP temporary upload folder on your server.
- Also ask them to verify that the temp folder is writable by the web server user.
Fix 11: Fix PHP Safe Mode / open_basedir
- Check if PHP Safe Mode is enabled. If it is, ask your host to disable it; it’s deprecated and causes widespread file operation failures.
- Check for
open_basedirrestrictions in your hosting panel or php.ini. - If
open_basediris restricting access outside a specific path, ask your host to adjust it to include your WordPress directory. - Alternatively, add this to yours
.user.iniorphp.ini(if your host allows it):open_basedir = none
Fix 12: Fix Multisite Upload Paths
- Go to Network Admin → Settings → Network Settings.
- Check the Uploads settings.
- Ensure the upload path uses a server-relative path (e.g.,
/home/username/public_html/wp-content/uploads) and the upload URL uses the full URI (e.g.,https://example.com/wp-content/uploads). - Don’t manually add
/sites/1/WordPress handles subsite folders automatically.
Fix 13: Check for Plugin Conflicts
- Go to Plugins → Installed Plugins.
- Deactivate all plugins except WordPress core.
- Try uploading a file.
- If it works, reactivate plugins one by one until uploads fail again.
- When you find the conflicting plugin, keep it deactivated and contact the developer.
Fix 14: Contact Your Hosting Provider
If none of the above fixes work, the issue is likely at the server level:
- Your host may have a server-wide security module (like ModSecurity) blocking file writes
- The server may be running
mod_phpwith mismatched ownership - Your account may have hit an invisible file count limit (not disk space, but number of files)
- The host may need to run
chownorchmodcommands you don’t have permission to run
Contact support with your Site Health report and describe exactly what you’ve tried.
Common Mistakes
| Mistake | Why |
|---|---|
| Setting permissions to 777 | 777 allows anyone to read, write, and execute files. This is a massive security risk and can get your site hacked. Always use 755 for folders and 644 for files. |
| Only fixing the uploads folder, not subfolders | WordPress creates year/month subfolders inside uploads. If those are 644, uploads to specific months will still fail. Apply permissions recursively. |
| Changing permissions without checking ownership | Correct permissions with wrong ownership still block writes. Always verify both. |
| Editing wp-config.php without a backup | One typo in wp-config.php can break your entire site. Always back up before editing. |
| Assuming it’s a permissions issue when disk is full | If your server is out of space, no permission change will help. Check disk usage first. |
| Leaving a hard-coded upload_path after migration | The old path from your previous host will never work on the new server. Always clear upload_path in wp_options after migrating. |
Advanced Fixes
Fix Ownership with chown
If you have root SSH access and the web server user is different from the file owner:
sudo chown -R www-data:www-data /var/www/html/wordpress
sudo chmod -R 755 /var/www/html/wordpress/wp-content/uploads
Replace www-data with your actual web user and /var/www/html/wordpress with your actual WordPress path.
Fix Symbolic Link Issues After Migration
If you changed usernames during a migration (e.g., from olduser to newuser), WordPress may still look for the old path.
- Check Tools → Site Health → Info → Directories and Sizes to see what path WordPress thinks it’s using.
- If it shows the old username, either update the
upload_pathin the database or create a symbolic link:ln -s /home/newuser /home/olduser - The symbolic link is a quick fix, but updating the database path is the cleaner long-term solution.
Reset Upload Path via phpMyAdmin
- Log into phpMyAdmin.
- Select your WordPress database.
- Open the wp_options table.
- Find upload_path and upload_url_path.
- Click Edit on each row.
- Delete the value in option_value and click Go.
- WordPress will revert to the default
wp-content/uploadsdirectory.
Check for mod_php Conflicts
If your server runs mod_php instead of PHP-FPM, the PHP process runs as a different user than the web server. This causes ownership conflicts.
- Ask your host whether they use
mod_phporphp-fpm. - If it’s
mod_php, ask them to switch to PHP-FPM or FastCGI, which handle file ownership more cleanly. - Alternatively, ask them to configure
mod_phpto run as your account user (via SuPHP or mod_suexec).
Prevention Tips
- Never use 777 permissions: Stick to 755 for folders and 644 for files. Use 600 for wp-config.php.
- Check Site Health monthly: Make it a habit to review Tools → Site Health → Filesystem Permissions to catch issues early.
- Clear upload_path after every migration: Always delete the hard-coded upload path from wp_options when moving to a new host.
- Use PHP-FPM when possible: It handles ownership better than mod_php and reduces permission conflicts.
- Monitor disk space: Set up alerts with your host so you never hit your storage limit unexpectedly.
- Back up before permission changes: Always create a full backup before modifying file permissions or ownership.
- Don’t edit files as root: If you use SSH, avoid creating or editing WordPress files as the root user. Use your web server user or your account user.
- Test uploads after major changes: After migrating, updating, or changing hosts, immediately test a media upload to confirm everything works.
Related Guides
- WordPress Critical Error: Complete Fix Guide
- WordPress White Screen of Death: Complete Fix Guide
- WordPress 500 Internal Server Error: Complete Fix Guide
- WordPress Memory Exhausted Error: Complete Fix Guide
- WordPress 403 Forbidden Error: Complete Fix Guide
- WordPress 404 Error After Permalink Change: Complete Fix Guide
- WordPress Stuck in Maintenance Mode: Complete Fix Guide
- WordPress Parse Error: Complete Fix Guide
- WordPress Syntax Error: Complete Fix Guide
Frequently Asked Questions
Why does WordPress say “Upload folder is not writable”?
The most common causes are incorrect file permissions (folders should be 755, files 644), wrong file ownership (the web server user doesn’t own the uploads folder), a hard-coded upload path from a previous host that no longer exists, or the server being out of disk space.
What are the correct file permissions for the WordPress uploads folder?
The wp-content/uploads folder should be set to 755. Files inside it should be 644. The wp-config.php file should be locked down to 600 or 640. Never use 777; it creates a severe security risk.
How do I fix “Unable to create directory uploads/2026/08? Is its parent directory writable by the server?”
This specific error means WordPress can’t create the year/month subdirectory inside uploads. Fix the wp-content/uploads folder permissions to 755, ensure the web server user owns the folder, and verify you haven’t run out of disk space. If you recently migrated, clear the upload_path value in your wp_options database table.
Can a full disk cause the “upload folder not writable” error?
Yes. If your hosting account has reached its disk space limit, WordPress cannot write new files anywhere. The error message looks identical to a permissions issue. Always check your disk usage in your hosting panel before troubleshooting permissions.
What is the FS_METHOD direct setting in WordPress?
Adding define('FS_METHOD', 'direct'); to your wp-config.php file forces WordPress to write files directly using PHP instead of prompting for FTP credentials. This is the standard and recommended method for most modern hosting environments.
Why do I still get the error even after setting permissions to 755?
If permissions are correct but uploads still fail, the issue is likely file ownership. The web server runs as a specific user (like www-data), and if that user doesn’t own the uploads folder, it can’t write to it, even with 755 permissions. Use SSH to check ownership with ls -la and fix it with chown, or contact your host.
Conclusion
The “Upload folder is not writable” error is one of the most common yet most fixable issues in WordPress. In the vast majority of cases, the solution is simply setting the correct file permissions (755 for folders, 644 for files) and ensuring the web server user owns the uploads directory.
But when permissions aren’t the issue, the culprit is usually a hard-coded upload path from a previous host, a full disk, or a server-level restriction like open_basedir or mod_php. By working through the 14 fixes in this guide systematically, you’ll isolate the exact cause and restore your ability to upload media, install plugins, and export data.
Remember: never use 777 permissions as a quick fix. It may solve the immediate problem, but it opens your site to serious security vulnerabilities. Always use the principle of least privilege and give WordPress only the permissions it needs and nothing more.
If you found this guide helpful, share it with fellow WordPress users who are staring at a red “Upload folder is not writable” notification on their dashboard.

