WordPress画像アップロード失敗|原因と直し方【初心者向け】

WordPressで画像アップロード時にディスクへの書き込み失敗が起きている状況のイメージ

WordPressで画像を追加しようとすると、
「ディスクへのファイルの書き込みに失敗しました」と表示されて困っていませんか?

記事の編集やログインはできるのに、画像だけアップロードできない。
検索で見つけた方法を試しても直らないと、どこを確認すべきか迷ってしまいます。

このエラーでは、最初から wp-content/uploads/ の権限を変更するのはおすすめしません。
多くの場合、確認すべき場所は画像の最終保存先より手前にあります。

よこやま良平

ITエンジニアとして20年以上WordPressに携わってきたよこやま良平です。わたしが実際の復旧現場で確認した事例をもとに、初心者でも原因を切り分けられる順番で解説します。

この記事でわかること
  • 「ディスクへのファイルの書き込みに失敗しました」の意味
  • uploadsの権限を変えても直らない理由
  • 一時フォルダとクォータを安全に確認する方法
  • 原因別の対処法と、実際に復旧した事例
  • 同じエラーを繰り返さないための予防策

結論から言うと、WordPress標準のメディア追加でこの文言が出た場合、
PHPがアップロード中の一時ファイルをディスクへ書けなかった可能性が高いです。

原因は空き容量だけとは限りません。
アカウントごとの割り当て上限、権限や所有者、inode不足なども含めて順番に確認しましょう。

【無料プレゼント】
WordPress緊急チェック50

「自分のサイトは今、安全なのか?」
自信を持って答えられますか?

WordPress緊急チェック50

こんなお悩みはありませんか?

  • ある朝、サイトを開いたら真っ白画面になっていた
  • 管理画面にログインできなくなって手が止まった
  • 身に覚えのない記事やページが勝手に増えていた
  • プラグインを更新したらサイト全体が崩れてしまった
  • 以前バックアップを取ったか自分でも覚えていない

累計1,000件以上のWordPressトラブル対応の経験から、「壊れる前に備える」ためのチェックリストを1冊にまとめました。
ログイン・本体・バックアップ・サーバー・運用の5分野を、50項目で「危険度・確認方法・対処法」まで解説しています。

セキュリティプラグイン・WordPressの教科書も含めた3大特典を、
今なら無料で受け取れます。

今すぐ無料ダウンロードする →

※登録後すぐにメールで特典をお届けします

WordPress画像アップロード失敗で書き込みエラーが出る意味

このエラーは、WordPressが画像を uploads へ移す前の段階で、
PHPのファイル受信処理が失敗したことを示します。

ブラウザから送った画像は、いきなりメディアライブラリへ入るわけではありません。
まずPHPが一時ファイルとして受け取り、その後にWordPressが最終保存先へ移します。

ブラウザから送った画像がPHPの一時フォルダを経てWordPressのuploadsへ移動する流れ
標準の画像アップロードは、PHPの一時保存を通ってからuploadsへ移動します。

画像は4つの段階を通って保存されます

画像が保存される順番
  1. ブラウザが画像をサーバーへ送る
  2. PHPが一時ファイルとしてディスクへ書き込む
  3. WordPressが wp-content/uploads/ へ移動する
  4. 縮小画像を生成し、メディア情報を登録する

「ディスクへのファイルの書き込みに失敗しました」は、
2番の段階でPHPから返されたエラー番号7をWordPressが日本語で表示したものです。

PHPのエラー番号で失敗した段階を見分けられます

WordPress標準のアップロード処理は、PHPのエラー番号に応じて文言を変えます。
よく見る番号を整理すると次のとおりです。

PHPの番号WordPressの主な表示確認する内容
1php.iniのupload_max_filesizeを超過PHP側のサイズ上限
2HTMLフォームのMAX_FILE_SIZEを超過フォーム側のサイズ上限
6一時フォルダーがありません一時ファイルを作る場所
7ディスクへのファイルの書き込みに失敗しました一時ファイルへの書き込み

一方、PHPの受信に成功したあとで uploads への移動に失敗すると、
WordPressは「アップロードしたファイルを○○に移動できませんでした」という別の文言を返します。

ここで説明しているのは、WordPress標準の管理画面からメディアを追加した場合です。独自プラグインや外部APIが独自のエラー文を出している場合は、処理経路が異なることがあります。

目次

WordPress画像アップロード失敗の主な原因

書き込みエラーの原因は、空き容量不足だけではありません。
とくに共有サーバーでは、全体の空きと利用者ごとの上限を分けて考える必要があります。

ディスク容量またはinodeを使い切っている

サーバーのファイルシステムが満杯になると、新しい一時ファイルへデータを書けません。
取り忘れたバックアップや、増え続けたログが原因になることがあります。

容量に空きがあっても、作成できるファイル数の上限である「inode」を使い切ると、
No space left on device が出る環境もあります。

アカウントのクォータを超えている

共有サーバーでは、利用者ごとや領域ごとに書き込み上限が設けられることがあります。
この割り当て上限を「クォータ」と呼びます。

サーバー全体には空きがあっても、自分のアカウントや一時領域の枠が満杯なら書き込めません。
そのため、管理画面に「空きあり」と表示されるだけでは判断できない場合があります。

サーバー全体に空きがあっても一時フォルダのクォータが上限に達する違い
サーバー全体の空き容量と、アカウントに割り当てられたクォータは別に確認します。

権限・所有者・一時パス・I/Oに問題がある

一時フォルダへアクセスするPHPの実行ユーザーに書き込み権限がない場合も失敗します。
数字のパーミッションだけでなく、フォルダの所有者とグループが重要です。

ほかにも、存在しない一時パス、inodeクォータ、読み取り専用になったファイルシステム、
ストレージのI/O障害やサーバー側のセキュリティ制約などが候補になります。

最初に疑う原因
  • ディスクまたはinodeの空き不足
  • アカウント・領域ごとの容量またはinodeクォータ超過
  • 一時フォルダの権限・所有者の不一致
  • 一時フォルダ設定やサーバー側ストレージの異常

WordPress画像アップロード失敗を安全に診断する手順

原因を早く見つけるには、パーミッションを変更する前に、
一時フォルダへ実際に書き込めるかを確認するのが近道です。

初心者はサーバー管理画面から順番に確認する

初心者が最初に確認する順番
  1. サーバー管理画面でディスク使用量とファイル数を確認する
  2. バックアップやログが急に増えていないか確認する
  3. WordPress本体・プラグインの更新も失敗していないか確認する
  4. 小さな画像でも同じ文言になるか確認する
  5. 判断できなければサーバー会社へエラー文を送る

サーバー会社がわからない場合は、次の調査ツールも利用できます。
契約先を確認してから、サポートへ相談すると話が早く進みます。

診断スクリプトで実際の一時フォルダを試し書きする

FTPでファイルを設置できる場合は、次のコードで切り分けできます。
upload_tmp_dir が設定されている環境では、その実パスも検査するようにしています。

設置前の注意
  • CHANGE_THIS_TO_RANDOM_20_CHARS を推測されにくい文字列へ変更する
  • 確認中だけ設置し、終わったら必ず削除する
  • 表示結果を掲示板やSNSへそのまま貼らない
<?php
header('Content-Type: text/plain; charset=UTF-8');

$key = 'CHANGE_THIS_TO_RANDOM_20_CHARS';
if (!isset($_GET['key']) || !hash_equals($key, (string) $_GET['key'])) {
    http_response_code(403);
    exit('403 Forbidden');
}

function last_error_message() {
    $error = error_get_last();
    return $error['message'] ?? '詳細なエラーなし';
}

function probe($label, $dir) {
    echo "== {$label} ==\n";
    echo "パス: " . var_export($dir, true) . "\n";

    if ($dir === '' || !is_dir($dir)) {
        echo "結果: フォルダが存在しません\n\n";
        return;
    }

    echo "is_writable: " . (is_writable($dir) ? 'YES' : 'NO') . "\n";
    $free = @disk_free_space($dir);
    echo "空き容量: " . ($free === false ? '取得できません' : $free . ' bytes') . "\n";

    $path = rtrim($dir, DIRECTORY_SEPARATOR)
        . DIRECTORY_SEPARATOR
        . 'qr_probe_' . bin2hex(random_bytes(6)) . '.tmp';

    error_clear_last();
    $fp = @fopen($path, 'xb');
    if (!$fp) {
        echo "作成失敗: " . last_error_message() . "\n\n";
        return;
    }

    error_clear_last();
    $written = @fwrite($fp, str_repeat('x', 1048576));
    $write_error = error_get_last();
    @fclose($fp);
    @unlink($path);

    if ($written === 1048576) {
        echo "1MB書込: OK\n\n";
    } else {
        $detail = $write_error['message'] ?? '詳細なエラーなし';
        echo "1MB書込: NG / 書込バイト数="
            . var_export($written, true) . " / {$detail}\n\n";
    }
}

echo "読み込み中のphp.ini: "
    . var_export(php_ini_loaded_file(), true) . "\n";
echo "追加ini: "
    . var_export(php_ini_scanned_files(), true) . "\n";

$upload_tmp = trim((string) ini_get('upload_tmp_dir'));
echo "upload_tmp_dir: " . var_export($upload_tmp, true) . "\n";
echo "sys_temp_dir: "
    . var_export(ini_get('sys_temp_dir'), true) . "\n\n";

if ($upload_tmp !== '') {
    probe('upload_tmp_dir', $upload_tmp);
} else {
    echo "upload_tmp_dirは未指定です。システム既定を確認します。\n\n";
}

$system_tmp = sys_get_temp_dir();
if ($system_tmp !== $upload_tmp) {
    probe('sys_get_temp_dir', $system_tmp);
}

ファイル名を check-upload-temp.php としてWordPressの公開フォルダへ置き、
次のように自分で設定したキーを付けて開きます。

https://あなたのドメイン/check-upload-temp.php?key=設定したランダム文字列

このスクリプトは原因の切り分けに役立ちますが、すべてのサーバー障害を確定できるものではありません。詳細なエラーが出ない時は、結果を非公開のままサーバー会社へ伝えてください。

作成失敗または1MB書込NGのメッセージを読む

見る場所は「作成失敗」または「1MB書込: NG」の直後です。
空き容量の数字だけでなく、実際の試し書きの結果を優先します。

診断結果からディスク不足・クォータ超過・権限・パス誤りを判定する流れ
表示されたメッセージごとに、確認する場所を分けます。
表示例主な確認先
No space left on deviceディスク容量、inode、ログ、バックアップ
Disk quota exceeded
Disc quota exceeded
容量クォータ、inodeクォータ、アカウントの割り当て
Permission denied実行ユーザー、所有者、グループ、権限、セキュリティ制約
フォルダが存在しません読み込まれた設定と実際のパス

0バイトのファイルは作れても、データを書いた時に失敗する場合は、
容量やクォータ超過の強い手がかりになります。ただし、それだけで原因を断定はできません。

確認後に必ず行うこと
  • check-upload-temp.php をサーバーから削除する
  • 検索エンジンや第三者から開けないことを確認する
  • 共有した結果にパスやアカウント名が含まれていないか確認する

WordPress画像アップロード失敗の原因別対処法と復旧事例

対処法は、診断で確認できた原因に合わせて選びます。
初心者の方は、削除対象を判断できないままSSHコマンドを実行しないでください。

容量・inode・クォータ超過は不要物を特定して空ける

管理画面で古いバックアップや肥大化したログを確認し、
必要なものを別の安全な場所へ保存してから整理します。

SSHが使える方は、次の読み取り専用コマンドで状況を確認できます。
アカウント名 は実際のサーバーアカウントへ置き換えてください。

# アカウントの割り当て状況
quota -h -v

# ファイルシステムの容量とinode
df -h
df -i

# 一時領域にある自分のファイルを大きい順に確認
find /tmp /var/tmp -user アカウント名 -type f -ls 2>/dev/null \
  | sort -k7 -rn | head -40

# 自分のファイル数
find /tmp /var/tmp -user アカウント名 -type f 2>/dev/null \
  | wc -l
削除コマンドを実行する前に
  • ファイル名、所有者、日時、容量を一覧で確認する
  • バックアップ処理や別システムが現在使用中でないか確認する
  • 日数や sess_* という名前だけで不要と判断しない
  • 判断できなければ一覧をサーバー会社へ送り、削除を依頼する

PHPセッションの保持期間は、サーバー設定や利用中のシステムによって異なります。
「1日以上前なら安全」のような一律の削除は、ログアウトや処理中断を招くため避けましょう。

一時フォルダの場所を変更する時は影響範囲を確認する

サーバー会社が許可している場合は、HTTPアップロード用の一時フォルダを、
余裕のある専用領域へ変更する方法があります。

upload_tmp_dir = /home/アカウント名/tmp/php-upload

指定先は先に作成し、PHPの実行ユーザーが書ける所有者・グループ・権限にします。
適切な設定はサーバー構成で変わるため、ホスティング会社の案内を優先してください。

upload_tmp_dirsys_temp_dir は、PHPの変更モードでは INI_SYSTEM です。
.user.ini や実行中の ini_set() では変更できません。

一般的には、サーバー管理画面のphp.ini設定や管理者側のサーバー設定から変更します。
sys_temp_dir はPHP全体へ影響するため、画像アップロードだけが目的なら安易に同時変更しない方が安全です。

設定値が表示されたことと、フォルダが実在して書き込めることは別です。変更後は診断スクリプトの実書き込みと、WordPressのメディア追加の両方で確認してください。

実例では別システムのバックアップ残骸が原因だった

今回の復旧事例では、WordPressの設定や uploads の権限は正常でした。
画像アップロードだけでなく、その少し前からWordPress本体の更新も失敗していました。

復旧前に確認できた症状
  • 画像だけが「ディスクへのファイルの書き込みに失敗しました」で止まる
  • 記事の投稿とログインは正常
  • uploadsのパーミッションは正常
  • ファイルシステムには18GB以上の空きが表示される

試し書きでは、空き容量が約18GBと表示された一方で、
Disc quota exceeded が返りました。

空き容量 : 18125922304
1MB書込 : NG
Disc quota exceeded

一時領域を確認すると、前日に失敗した別システムのバックアップ処理が、
書き出し途中のファイルを大量に残していました。

見つかった原因
  • 同じ時刻に生成されたバックアップXML・画像・音声など
  • 合計23,741ファイル
  • 使用量は約990MB
  • 一時領域のクォータは1GB

生成元・時刻・所有者・処理の停止を確認したうえで、対象の残骸だけを整理しました。
その結果、一時領域の使用量は990MBから8KBまで減りました。

この時点でWordPress側の設定やuploadsの権限を変えなくても、
画像アップロードは正常に復旧しました。

この事例のポイントは、WordPress以外の処理でも同じ一時領域やクォータを使う可能性があることです。バックアップ実行の直後から不具合が出た時は、時刻の一致も確認します。

WordPress画像アップロード失敗を繰り返さない予防策

再発を防ぐには、バックアップ・一時領域・ログを定期的に点検します。
ホームディレクトリに余裕があっても、一時領域の枠が小さい構成は珍しくありません。

大きなバックアップの前後にクォータを確認する

エクスポートやバックアップを始める前に、使用量とファイル数を確認します。
処理に失敗した時は、完成ファイルだけでなく一時ファイルが残っていないかも確認してください。

ログを有効にする時は保存先とローテーションも決める

PHPの関連警告がエラーログへ残る場合があります。
ログを使う時は、公開フォルダの外を保存先にし、定期的にローテーションしてください。

log_errors = On
error_log = /home/アカウント名/log/php/php.log

log_errors を有効にしても、OSの詳細な書き込み理由が必ず残るとは限りません。
根本原因は実際の試し書き、クォータ、サーバー会社の調査も合わせて判断します。

一時フォルダとWordPress全体を定期点検する

サーバー会社が対応しているなら、WordPress用のアップロード一時領域を分ける方法もあります。
ただし、設定変更後は必ず所有者・書き込み・実アップロードを確認してください。

容量、バックアップ、更新、ログをまとめて確認することで、
画像アップロードが止まる前の小さな前兆に気づきやすくなります。

WordPress画像アップロード失敗のよくある質問

最後に、同じエラーでよく聞かれる質問へまとめて回答します。

uploadsフォルダは777にすれば直りますか?

777の常用は避けてください。標準のエラー7はuploadsへの移動より前で発生しているため、直接の解決にならない可能性が高いです。一般には755を起点にし、書けない時は所有者・グループとPHPの実行ユーザーをサーバー会社へ確認します。環境によっては775などが必要な場合もあります。

サーバーに空き容量があるのに、なぜ失敗するのですか?

サーバー全体の空きと、アカウントや一時領域のクォータは別だからです。容量クォータだけでなく、inodeやファイル数の上限も確認してください。実際の試し書きで Disk quota exceeded が出たら、割り当て超過を疑います。

ブラウザーのアップローダーへ切り替えれば直りますか?

サーバー側の一時ファイル書き込みが原因なら、画面を切り替えても直りません。送信後は同じPHPのアップロード処理を通るためです。別の小さな画像でも同じ文言になるかを確認し、サーバー側を切り分けてください。

wp-config.phpのWP_TEMP_DIRで直りますか?

標準管理画面の最初のファイル受信で起きたエラー7には、原則として効きません。WP_TEMP_DIR はWordPress内部の一時ファイル処理を上書きする設定で、更新・HTTP処理・一部のメディア処理やREST経由の処理には影響しますが、PHPがHTTPアップロードを最初に受け取る場所とは別です。

古いsess_ファイルはまとめて削除してよいですか?

名前や日数だけで一括削除しないでください。セッションの有効期間と用途は、PHP設定や利用中のシステムで変わります。削除すると利用者がログアウトしたり、別システムの処理へ影響したりする可能性があります。保存先と保持期間を確認し、判断できなければサーバー会社へ依頼してください。

WordPress画像アップロード失敗の解決方法まとめ

「ディスクへのファイルの書き込みに失敗しました」は、
標準のメディア追加では、uploadsへ移動する前のPHP一時ファイル書き込みで発生するエラーです。

解決までの要点
  • 最初からuploadsを777にしない
  • ディスク容量・inode・クォータを分けて確認する
  • 実際のupload_tmp_dirとシステム一時フォルダを試し書きする
  • 削除前にファイルの所有者・日時・生成元を特定する
  • 判断できない時はエラー文と診断結果をサーバー会社へ伝える

今回の事例では、別システムの失敗したバックアップが一時領域のクォータを使い切っていました。
原因を確認して対象だけを整理したことで、WordPressの設定を変えずに復旧しています。

推測で設定を変える前に、まず「どの場所へ、なぜ書けないのか」を確認しましょう。
それが安全で早い解決につながります。

WordPressの画像アップロードエラーが自分で解決できない時は

WordPress修復マルウェア駆除トラブル専門「クイックレスキュー」

画像が1枚も追加できない、WordPressの更新まで止まる、原因を判断できない場合は、
クイックレスキューへご相談ください。

こんなお悩みはありませんか?
  • 「ディスクへのファイルの書き込みに失敗しました」が直らない
  • サーバーの容量は空いているのに画像を追加できない
  • SSHやphp.iniの操作に不安がある
  • 削除してよいファイルを判断できない
  • WordPressの更新も失敗している

原因調査から復旧までまとめて対応します。
設定を変更する前の状態でも、そのままご相談いただけます。

3つの安心保証
  • 万一復旧できない場合やマルウェア駆除できない場合は全額返金保証で安心
  • 90日間再感染保証・動作保証で安心
  • 初期費用・調査費用0円で安心

この記事を書いた専門家

こんにちは!20年以上ITエンジニアとして活動してきた
よこやま良平です。

Wordpress復旧やサイト修復、オンライン講座では
776件以上のレビューを頂いており

「すぐに復旧してくれる!」
「当日行ってくれて助かった!」など

評価は4.9/5.0と非常に高く好評です。

またWordPress、SEO、Officeなど30冊以上の書籍を出版しており、
売上ランキング1位を連続で獲得致しました。

その他これまでに3000以上のサービス・システム・サイトを作成。

多くの方の「できない」や「悩み」を解決してきました。
その観点からわかりやすく解説しています。

目次