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
API Reference
Discussion