sfw/fix
Upload Dir high

Unable to create directory wp-content/uploads. Is its parent directory writable?

WordPress can't write into wp-content/uploads, usually a permissions or ownership problem, occasionally a full disk.

What you see

Unable to create directory wp-content/uploads/2026/06. Is its parent directory writable by the server?

What’s actually happening

Media Library uploads fail and you get this message, often after a host migration, a manual file restore, or a security "hardening" that reset permissions. Images won't attach to posts; the year/month subfolder never gets created. The web server process simply lacks write access to the path — or the path is full.

Common causes

  • The uploads directory (or wp-content) is owned by a different user than the one PHP/the web server runs as, so writes are denied
  • Directory permissions are too restrictive — 555 or 644 on a folder instead of 755 — so the server can't create the dated subfolder
  • The disk or the account's inode/quota is full; the folder is writable but there's no room to create the file
  • An incorrect custom path in Settings > Media (upload_path option) points somewhere that doesn't exist or isn't writable
  • SELinux or an open_basedir / hardening rule blocks writes to that path even though Unix permissions look fine

How to fix it

  1. Set correct permissions: 755 on directories, 644 on filesOver SSH from the site root: `find wp-content/uploads -type d -exec chmod 755 {} \;` and `find wp-content/uploads -type f -exec chmod 644 {} \;`. Via FTP, right-click the uploads folder, set 755, and apply recursively to directories. Never use 777 — it's a security hole and rarely the actual fix.
  2. Fix ownership to match the web server userThe files must be owned by the user PHP runs as (often www-data, apache, or nginx; on cPanel it's your account user). Check with `ps aux | grep -E 'apache|php|nginx'`, then `chown -R youruser:www-data wp-content/uploads`. Ownership mismatches are the #1 cause after a migration or a restore done as root.
  3. Check for a full disk or quota`df -h` for disk space and `df -i` for inodes. On shared hosting, check the quota in cPanel. If you're at 100%, permissions are a red herring — clear space (old backups, logs, /tmp) and the upload will succeed.
  4. Verify the upload path in the databaseIn Settings > Media, or via `wp option get upload_path`, make sure there's no stale absolute path left over from another server. Blank it (`wp option update upload_path ''`) to let WordPress fall back to the default wp-content/uploads.
  5. Rule out SELinux / hardeningOn CentOS/RHEL with SELinux enforcing, run `chcon -R -t httpd_sys_rw_content_t wp-content/uploads`. Also check any open_basedir restriction in php.ini that might exclude the path.

Stop it recurring

After any migration or restore, immediately reset uploads to 755/644 and chown it to the web-server user, then test one upload.

Related errors