この記事の結論
Claude Codeに貼り付けた画像の保存場所は、ダウンロードフォルダではなく一時フォルダとセッション記録です。記録は既定30日で消えます。公式の記載と当社の実測、取り出し用のスクリプトをまとめました。
目次6項目
【実践講座】Claude Code 2daysセミナー(第二の脳構築講座)の詳細を見る →
Claude Codeに貼り付けた画像の保存場所は、ダウンロードフォルダではありません。2026年10月時点の公式ドキュメントでは、セッションごとの一時フォルダに保存されると説明されています。当社では、セッション記録(.jsonl)に残った画像データからも復元できました。記録は既定30日で消えるので、早めに取り出します。
貼り付けた画像がダウンロードフォルダに見つからない原因
原因は、貼り付けた画像の保存場所がダウンロードフォルダや作業フォルダではないことです。公式ドキュメントによると、画像はClaude Codeが内部で使う一時フォルダに置かれます。Finderで普段開く場所ではないので、探しても見つかりません。
公式ドキュメントに書いてある保存場所
まず、画像の渡し方です。公式ドキュメントは、次の3つを挙げています。
- 画像をClaude Codeのウィンドウにドラッグ&ドロップする
- 画像をコピーして、CLIに
Ctrl+Vで貼り付ける(iTerm2ではCmd+V、WindowsとWSLではAlt+V) - 画像のファイルパスを文章で伝える
デスクトップアプリでは、添付ボタンか、入力欄へのドラッグ&ドロップで画像やPDFを添付できます。CLIで貼り付けると、入力欄に [Image #N] という印が入ります。
次に、保存場所です。公式ドキュメント(.claude ディレクトリの解説ページ)には、次のように書かれています。
- v2.1.274以前は、添付した画像を
~/.claude/image-cache/<session>/に保存していた - それより新しいバージョンは、貼り付けた画像と添付した画像を
~/.claudeの外、一時フォルダの下にあるセッションごとのimages/フォルダに保存する - この画像は、設定の
cleanupPeriodDays(既定30日)より古くなると自動で削除される
一時フォルダとは、アプリが作業の途中で使うファイルを置く、OSが用意した仮置きの場所のことです。macOSでは既定で /tmp の下に claude-<uid> というフォルダが作られ、その中がプロジェクトごと、セッションごとに分かれます。環境変数 CLAUDE_CODE_TMPDIR で場所を変えられます。
公式に書かれていない、もう1つの残り場所(セッション記録)
セッション記録とは、Claude Codeが会話の内容・ツールの呼び出し・その結果を、1行ずつJSONで書きためるファイルです。公式ドキュメントによると、場所は ~/.claude/projects/<project>/<session>.jsonl で、暗号化されていない平文です。
このファイルの中に、画像がbase64の文字列で入っていることがあります。base64とは、画像などのデータを英数字の文字列に置き換えて、テキストの中に埋め込めるようにする書き方です。ただし「画像がセッション記録にbase64で入る」という説明は、公式ドキュメントには見当たりませんでした。ここは当社の環境で確かめた内容で、後の章に実測を書きます。
| 探す場所 | 何が残るか | 根拠 | いつ消えるか |
|---|---|---|---|
| ダウンロードフォルダ・作業フォルダ | 残らない | 公式の保存場所に含まれない | - |
一時フォルダのセッションごとの images/ | 貼り付けた画像・添付した画像のファイル | 公式ドキュメント | cleanupPeriodDays(既定30日)を過ぎると削除 |
~/.claude/image-cache/<session>/ | v2.1.274以前に添付した画像 | 公式ドキュメント | 同じ掃除で削除 |
セッション記録(.jsonl) | base64の画像データ | 当社の実測(公式に記載なし) | 既定30日。デスクトップアプリの記録は既定で対象外 |
貼り付けた画像を取り出す4つの対処手順
取り出す順番は、手間の少ないものからです。チャットの画像リンクを開く、一時フォルダを見る、セッション記録から復元する、の順に試します。どれも無ければ、記録ごと消えているので、画像をもう一度もらいます。
- チャットの画像リンクから開く:公式ドキュメントによると、Claudeが
[Image #1]のように画像を参照したとき、MacならCmd+クリック、WindowsとLinuxならCtrl+クリックで、標準のビューアで画像が開きます。開けたら、ビューアから別名で保存します。 - 一時フォルダの
images/を見る:公式ドキュメントは、images/の正確なパスまでは書いていません。手がかりは、同じ一時フォルダにあるスクラッチパッド(AIの作業用フォルダ)の場所で、macOSでは/private/tmp/claude-<uid>/<project>/<session-id>/scratchpad/と示されています。<project>は、作業フォルダのパスの英数字以外を-に置き換えた名前です。Finderの「移動」→「フォルダへ移動」に/private/tmpと入れて開き、セッションのフォルダの中のimages/を探します。 - セッション記録から復元する:上の2つで見つからないときは、
~/.claude/projects/<プロジェクトのフォルダ名>/の中から、画像を貼った日時に更新された.jsonlを選び、下のスクリプトにかけます。 - どれも無ければ再送を頼む:記録の保持期間を過ぎている、別のパソコンで貼った、記録を書かない設定にしていた、のどれかです。復元はできません。
セッション記録から画像を取り出すスクリプト
当社で動作を確かめた版です。1行ずつJSONとして読み、辞書と配列を奥までたどって、base64の画像を見つけたらファイルに書き出します。追加のライブラリは要らず、python3 だけで動きます。
import base64
import hashlib
import json
import pathlib
import sys
src = pathlib.Path(sys.argv[1]).expanduser() # セッション記録(.jsonl)
out = pathlib.Path(sys.argv[2]).expanduser() # 画像の保存先フォルダ
out.mkdir(parents=True, exist_ok=True)
EXT = {"image/png": "png", "image/jpeg": "jpg", "image/webp": "webp", "image/gif": "gif"}
seen = set()
count = 0
def walk(node, path, found):
"""辞書と配列を奥までたどり、base64 の画像ブロックを集める"""
if isinstance(node, dict):
source = node.get("source")
if node.get("type") == "image" and isinstance(source, dict) and source.get("type") == "base64":
found.append((path, source.get("media_type"), source.get("data", "")))
for key, value in node.items():
walk(value, f"{path}.{key}" if path else key, found)
elif isinstance(node, list):
for value in node:
walk(value, path + "[]", found)
with open(src, encoding="utf-8") as f:
for lineno, line in enumerate(f, 1):
if '"base64"' not in line:
continue
try:
obj = json.loads(line)
except json.JSONDecodeError:
continue
found = []
walk(obj, "", found)
for path, media_type, data in found:
try:
raw = base64.b64decode(data)
except ValueError: # 壊れたデータは飛ばす
continue
digest = hashlib.sha1(raw).hexdigest()[:8]
if digest in seen: # 同じ画像が何度も記録されていても1枚だけ保存
continue
seen.add(digest)
count += 1
name = f"{count:03d}_line{lineno}_{digest}.{EXT.get(media_type, 'bin')}"
(out / name).write_bytes(raw)
print(name, media_type, len(raw), "bytes", path)
print(count, "枚を保存しました:", out)
extract_images.py という名前で保存して、次のように実行します。1つ目がセッション記録、2つ目が保存先のフォルダです。
python3 extract_images.py ~/.claude/projects/<プロジェクトのフォルダ名>/<セッションID>.jsonl ~/Desktop/recovered
使うときの注意が2つあります。1つ目は、目的の画像以外も出てくることです。AIが読み込んだ画像ファイルや、ブラウザのスクリーンショットも同じ形で記録に入っているので、保存先を開いて目で選びます。2つ目は、message.content の直下だけを探さないことです。当社の記録でも、その場所だけでは見つからない画像がありました。スクリプトが全体を再帰的にたどっているのは、そのためです。
裏方で実際に起きた「貼り付けた画像が取得できない」と、記録からの復元
僕の会社(株式会社UrakaTA)では、2026年7月29日に、貼り付けられた画像を見失いかけました。セッション記録を調べたところ、画像はbase64で残っていて、復元できました。2026年10月10日に同じ調べ方を追試したので、その結果も書きます。
2026年7月29日:ロゴの差し替えで、画像の再送を頼みかけた
住宅ローン関連のサービスを扱うクライアントの、ロゴを差し替える作業でした。担当者(僕自身)がClaude Codeのチャットに貼り付けたロゴの画像を、Claude Codeが「画像が取得できない」と扱えなくなりました。貼り付けた画像は、ダウンロードフォルダなどにファイルとしては出てきません。
AIが担当者に「もう一度送ってください」と頼む前に、セッション記録を調べました。すると、画像はbase64の文字列でそのまま残っていました。場所は2通りありました。
message.content[]の中(発言と一緒に送られた画像)attachment.prompt[]の中(AIの作業中に、途中で送られた画像)
message.content だけを探すと、見つからないことがあります。途中で送られた画像は attachment の下に入っているからです。辞書と配列を再帰的にたどる方法で、取り出せました。取り出したロゴは、背景を透明にしたPNGに加工してから使っています。
2026年10月10日の追試:記録の中の画像を数えた
同じ方法が今も使えるかを、当社のMac 1台で確かめました。調べたのは件数とキーの経路だけで、画像や会話の中身は見ていません。
- 対象:
~/.claude/projects/の下にあった.jsonl181ファイル(更新日 2026年10月2日〜10日・合計約218MB)。記録に書かれていたClaude Codeのバージョンは 2.1.246〜2.1.295 で、デスクトップアプリから使ったものです - base64の画像が入っていたファイル:181のうち55。うち31は、サブエージェントの記録など、セッションのフォルダの中にあるファイルでした
- 画像ブロックの数:199(同じ画像の重複を除くと約148)。形式はJPEG 159・WebP 21・PNG 19
- キーの経路:
message.content[].content[]が178、toolUseResult[]が21 - 画像の出どころ:ツールの結果145件のうち、画像ファイルを読むツールが120件、ブラウザのスクリーンショットが25件
- 先頭のバイトを照合したところ、199件すべてが、記録されている画像の形式どおりにデコードできました
正直に書くと、この追試では「人が貼り付けた画像」そのものは確認できていません。この期間の発言250件に、画像つきのものが1件も無かったためです。7月に見つけた message.content[] の直下と attachment.prompt[] は、今回は0件でした。一時フォルダにも、セッション直下の images/ フォルダはありませんでした(セッションのフォルダ71個を確認)。
分かったのは、2026年10月時点でも、ツールが読んだ画像についてはセッション記録にbase64で入る形が変わっていないことと、入る場所が1か所ではないことです。上のスクリプトは、場所を決め打ちせずに全体をたどるので、どの経路の画像も拾えます。自作のテスト用データ(attachment.prompt[] と message.content[] に同じ画像、ツールの結果に別の画像)で、重複を除いた2枚が正しく保存されることも確かめました。
貼り付けた画像を見失わないための再発防止
再発防止は、画像を「貼る」より「ファイルで渡す」に寄せることです。あとで使う画像は、先にプロジェクトのフォルダへ保存して、パスで伝えます。貼り付けは、その場で見せれば済むスクリーンショットに限ります。
当社で決めているルールは、次の3つです。
- あとで使う素材は、ファイルで渡す:ロゴや写真のように、作業の成果物に組み込む画像は、プロジェクトのフォルダに置いてからパスで伝えます。公式が挙げる3つの渡し方のうち、ファイルが手元に残るのはこの方法だけです。
- AIは、再送を頼む前にセッション記録を見る:「画像が取得できない」となったら、指示した人に聞き返す前に記録を調べる、と社内のメモに書いてあります。指示した人の手間を1往復減らせます。
- 必要な画像は、その日のうちに取り出す:公式ドキュメントによると、記録と一時フォルダの画像には保持期間があります。一時フォルダは、OSが再起動のときなどに片づけることもあります。必要だと分かった時点で、プロジェクトのフォルダへ移します。
パソコンを買い替えるときも注意が要ります。当社は会話の記録を新しいMacへ移さない方針なので、記録の中の画像も一緒に無くなります。移すものと移さないものの分け方は、Claude Codeを新しいMacへ引っ越す手順に書きました。
どのセッションで画像を貼ったかを後から探しやすくするには、セッションに案件の分かる名前を付けておきます。当社の付け方は、Claude Codeのセッション名を変更する方法と名前の付け方にまとめました。
業務でセッション記録を扱うときの注意
セッション記録は、画像だけでなく会話の全文が入った平文のファイルです。取り出しに使うのは自分の記録だけにして、ファイルごと他人に渡さないでください。画像を1枚渡したいだけなら、取り出した画像だけを渡します。
- 記録には、読み込んだファイルの中身も入っている:公式ドキュメントは、ツールを通ったものはすべて記録に書かれる、と説明しています。ファイルの中身、コマンドの出力、貼り付けた文章です。設定ファイルを読ませたり、コマンドが認証情報を表示したりすると、その値も記録に残ります。
- 暗号化されていない:公式ドキュメントによると、記録と履歴は保存時に暗号化されず、守っているのはOSのファイルの権限だけです。共有のパソコンや、バックアップの置き場所に気をつけます。
- 保持期間を決める:既定は30日で、
cleanupPeriodDaysで変えられます(最小は1。0は設定エラー)。デスクトップアプリの記録は既定で期限の対象外で、desktopSessionCleanupPeriodDaysを設定すると期限を付けられます。短くすれば漏えいの危険は減り、あとから画像を取り出せる期間も短くなります。 - チームでは、他人の記録を開かない:記録には、その人が扱ったクライアントの資料や画像が入っています。復元は本人が行い、取り出した画像だけを共有します。
- クライアントから預かった画像:貼り付けた時点で、一時フォルダと記録の両方に残り得ます。案件の終了時に消す約束がある場合は、プロジェクトのフォルダだけでなく、この2か所も対象に入れます。
画像以外の困りごと(ログイン・使用量の上限・会話の長さなど)は、Claude Codeのエラー一覧と直し方の早見表で症状から引けます。こうした運用ルールづくりを含めたAI活用の立ち上げは、ウラカタのサービス一覧でも紹介しています。
よくある質問
貼り付けた画像はダウンロードフォルダに保存されますか?
保存されません。2026年10月時点の公式ドキュメントでは、貼り付けた画像や添付した画像は、セッションごとの一時フォルダにある images フォルダに保存されると説明されています。古いバージョンでは設定フォルダの中の image-cache に保存されていました。
セッション記録はいつまで残りますか?
公式ドキュメントによると既定は30日で、設定の cleanupPeriodDays で変えられます。デスクトップアプリで始めた、または最後に続けたセッションの記録は、既定ではこの期限の対象外です。一時フォルダの画像は、同じ期限を過ぎると削除されます。
会話や画像を記録に残さない方法はありますか?
あります。公式ドキュメントでは、環境変数 CLAUDE_CODE_SKIP_PROMPT_HISTORY を 1 にすると、入力の履歴とセッション記録をディスクに書かないと説明されています。その場合、あとから会話を再開することも、この記事の方法で画像を取り出すこともできなくなります。