🙌

PythonでNotion APIのファイルアップロード機能を使ってみた

に公開

はじめに

2025年5月ごろ、待望の機能がNotion APIに追加されました。それがファイルアップロード機能です。これまでAPI経由でのファイル追加はできませんでしたが、このアップデートにより、Notionの活用幅がさらに広がりそうですね。
今回は、PythonのNotion SDKを使って、実際にデータベースのfilesプロパティに画像をアップロードできるのか試してみたいと思います。

導入

さっそく試していきたいと思いますが、まずは開発環境についてです。
今回は、Pythonのパッケージ管理ツールとしてuvを使用する環境を想定しています。notion-clientライブラリをインストールするため、ターミナルで uv add notion-client を実行してください。
また、データの追加先となるNotionのデータベースは、あらかじめインテグレーションの設定が完了しているものとします。APIトークンといった機密情報の管理にはpython-dotenvを利用し、安全に扱えるようにしておきましょう。
なお、使用するPythonのバージョンは3.7以上が要件となります。

データを入れてみる

環境が整ったところで、実際にデータを入れてみましょう。今回は、アップロードする画像として、nano-bananaで生成したイラストを適当なパスに配置して使用します。

import os
from dotenv import load_dotenv
from notion_client import Client

# 環境変数を読み込み
load_dotenv()

# Notionクライアントを初期化
notion = Client(auth=os.getenv("NOTION_API_TOKEN"))

def add_page_with_image():
    database_id = "<データソースのid>"
    image_path = "<相対パスで画像を配置>"
    
    try:
        # 1. 画像ファイルをアップロード
        upload_response = notion.file_uploads.create(
            filename="test.png",# ← Notion上での表示名
            content_type="image/png"
        )
        
        # 2. ファイルを送信
        with open(image_path, "rb") as file:
            notion.file_uploads.send(
                file_upload_id=upload_response["id"],
                file=file
            )
        
        # 3. データベースに新しいページを作成
        new_page = notion.pages.create(
            parent={"database_id": database_id},
            properties={
                "名前": {
                    "title": [{"text": {"content": "test"}}]
                },
                "画像": {
                    "type": "files",
                    "files": [
                        {
                            "type": "file_upload",
                            "file_upload": {
                                "id": upload_response["id"]
                            },
                            "name": "test.png"
                        }
                    ]
                }
            }
        )
        
        print("✅ ページが正常に作成されました!")
        print(f"ページURL: {new_page['url']}")
        
    except Exception as e:
        print(f"❌ エラーが発生しました: {e}")

if __name__ == "__main__":
    add_page_with_image()

上記のコードを実行して、コンソールに下記のようなログが出力されれば成功です。

✅ ページが正常に作成されました!

実際にNotionのデータベースを確認しにいくと、画像が添付された新しいページが追加されているはずです。とても簡単に追加できましたね。
ちなみに、20MBを超えるような大きなファイルをアップロードする場合は、マルチパートアップロードという手法を用いる必要があるので注意してください。

おわりに

今回は、Notion APIに追加されたファイルアップロード機能を試してみました。この機能が加わったことで、Notion APIの利便性は格段に向上したと言えるでしょう。
例えば、日々のレポートや画像を自動でNotionに集約するといった、様々な自動化のアイデアが実現しやすくなりました。今後のさらなるアップデートにも期待が高まりますね。

データソース

Notion SDK Python

https://github.com/ramnes/notion-sdk-py

Reddit

https://www.reddit.com/r/Notion/comments/1krbm7q/notion_shipped_file_uploads_via_the_public_api/

API Reference

https://developers.notion.com/reference/create-a-file-upload

Discussion