OpenAI API 文件上載與 PDF 輸入怎麼寫:input_file、file_id、file_url、base64 和 50 MB 限制

想讓模型讀你的 PDF、Word 或 CSV?Responses API 用 input_file 傳文件,有 file_id、file_url、base64 三種方式。本文講 Files API 上載、purpose 怎麼選、單文件和單請求 50 MB 限制、各類文件怎麼解析,以及什麼時候該改用文件搜尋。

NNathaniel bigo··原創首發·AI 輔助撰寫
8 分鐘讀完
資料核對於 2026-11-05 · 依據官方文檔與公開資料整理 其他 帳號
本文根據 OpenAI 官方《File inputs》整理,資料核對於 2026-11-05。配圖為本站整理的示意圖,不是介面截圖。代碼裏的模型名取自官方當天示例,請以官方模型頁為準。本站(bigolab.com)不是 OpenAI 官方網站。API 是按用量計費的獨立服務,與 ChatGPT 訂閱分開計算,Key 的獲取見 /guides/openai-api-key。

適用於誰

結論先說

  1. 文件用 input_file 這種輸入項傳,放在 content 數組裏,和 input_text 並排。
  2. 三種傳法:已經上載到 Files API 的 file_id、公開網址 file_url、base64 的 file_data(要配 filename)。
  3. 用於模型輸入的上載,purpose 填 user_data。
  4. 單個文件須小於 50 MB,同一請求裏所有文件合計不超過 50 MB。
  5. PDF 會同時送文字和頁面圖像,所以 token 用量會比純文本高;文件很多、很大時,官方建議改用文件搜尋,而不是整份塞進請求。

三種傳文件方式的選擇

圖:本站根據 OpenAI 官方《File inputs》 整理的示意圖

一、三種傳法對比

官方的對照表可以概括成這樣:

傳法字段Responses APIChat Completions
base64 數據file_data + filename支持各類文件只支持 PDF
已上載的文件 IDfile_id支持各類文件只支持 PDF
外部網址file_url支持各類文件不支持

官方的原話意思是:非 PDF 文件的輸入請用 Responses API。如果你一定要在 Chat Completions 裏讀非 PDF 文件的文字,辦法是在自己的程序裏先把內容讀出來,作為 text 內容部件發過去。

三個字段的含義:

  • file_id:用 Files API 上載後拿到的文件編號;
  • file_url:公開可訪問的文件網址,伺服器能直接拉取;
  • file_data:base64 編碼的文件內容,格式是 data URI,例如 data:application/pdf;base64,...,同時要寫 filename,例如 document.pdf。

二、方式一:先上載,再用 file_id

上載時 purpose 填 user_data。官方說其他受支持的 purpose 也能用,但這個是專門給“當作模型輸入”的文件準備的。

python
from openai import OpenAI

client = OpenAI()

# 1. 上載
uploaded = client.files.create(
    file=open("report.pdf", "rb"),
    purpose="user_data",
)

# 2. 在請求裏引用
response = client.responses.create(
    model="gpt-6-astra",  # 以官方模型頁當天為準
    input=[
        {
            "role": "user",
            "content": [
                {"type": "input_file", "file_id": uploaded.id},
                {"type": "input_text", "text": "請用五句話總結這份文件。"},
            ],
        }
    ],
)
print(response.output_text)

同一份文件要問很多次時,先上載再用 file_id 最省事:不用每次都把整個文件編碼、傳輸一遍。

三、方式二:base64 直接帶上

文件很小、不想多一次上載,可以直接把內容編碼放進請求。別忘了 filename。

python
import base64
from openai import OpenAI

client = OpenAI()

with open("report.pdf", "rb") as f:
    b64 = base64.b64encode(f.read()).decode("utf-8")

response = client.responses.create(
    model="gpt-6-astra",
    input=[
        {
            "role": "user",
            "content": [
                {
                    "type": "input_file",
                    "filename": "report.pdf",
                    "file_data": f"data:application/pdf;base64,{b64}",
                },
                {"type": "input_text", "text": "這份報告的三個主要結論是什麼?"},
            ],
        }
    ],
)
print(response.output_text)

base64 會讓請求體變大,所以要留意前面說的 50 MB 總量限制。

四、方式三:給公開網址 file_url

文件本來就掛在公開網址上,最簡單。下面是 Node.js 寫法,儲存為 .mjs 運行:

javascript
import OpenAI from "openai";

const client = new OpenAI();

const response = await client.responses.create({
  model: "gpt-6-astra", // 以官方模型頁當天為準
  input: [
    {
      role: "user",
      content: [
        { type: "input_file", file_url: "https://example.com/report.pdf" },
        { type: "input_text", text: "請列出這份文件裏的所有日期和金額。" },
      ],
    },
  ],
});
console.log(response.output_text);

網址必須是伺服器能訪問到的公開地址。需要登入才能打開的連結,模型拉不到,這種情況請改用上載。Node 裏上載文件的寫法是 openai.files.create({ file: fs.createReadStream("report.pdf"), purpose: "user_data" }),Node SDK 的基礎用法見 /guides/openai-api-nodejs-quickstart。

五、不同文件,模型實際“看到”什麼

PDF、文檔、表格各自送給模型什麼

圖:本站根據 OpenAI 官方《File inputs》 整理的示意圖

官方按類型說明了處理方式:

  • PDF:文字和每頁的圖像都會送給模型,所以需要支持視覺的模型(官方舉例 gpt-4o 及之後的模型);
  • Word、PowerPoint、純文本、代碼文件等:只送文字,文件裏嵌入的圖片和圖表不會被提取;
  • 表格(xlsx、csv、tsv):每個工作表最多解析前 1000 行,並附上模型生成的摘要和表頭資訊。

兩個實用推論:

  • 文檔裏有圖表、示意圖而你需要模型看懂,先轉成 PDF 再傳;
  • 表格行數很多、要做關聯、彙總、畫圖,官方的建議是用託管 shell 做複雜處理,而不是靠這種輸入方式。

六、detail 參數:控制 PDF 頁面圖像的精細程度

detail 是可選的,隻影響 PDF 頁面圖像,取值 auto、low、high,預設 auto:

  • low:用更少的輸入 token;
  • high:給密集圖表、小字、示意圖更多細節;
  • auto:官方寫的是在 GPT-5.6 及更新模型上按 high,更早的模型按 low。

detail 不改變提取出來的文字,文字總是會送入。Chat Completions 不支持這個參數。

七、費用和選擇

PDF 的文字和頁面圖像都進上下文,token 用量會上升。官方的提醒是上線前先看價格和 token 影響。價格以官方價格頁當天為準,參見 /guides/openai-api-price-official-table,粗估辦法見 /guides/openai-api-token-count-estimate。

如果你有一大堆文檔要反覆查詢,整份塞進每個請求既貴又慢。官方在這裏的建議是改用文件搜尋(File Search):先把文檔放進向量庫,由檢索挑出相關片段。這個工具本文不展開。

常見問題

Q:為什麼提示文件太大?

單個文件須小於 50 MB,同一請求內合計不超過 50 MB。拆成幾個請求,或者拆分文件。具體報錯訊息官方頁面沒有逐條列出,錯誤碼的整體排查見 /guides/openai-api-error-codes。

Q:Chat Completions 能傳 Word 文件嗎?

官方表格裏它只支持 PDF。其他類型請用 Responses API,或者自己讀出文字再發。

Q:模型沒看到文檔裏的圖表?

非 PDF 文檔只送文字。先轉成 PDF 再傳,並考慮把 detail 設為 high。

Q:想讓模型邊讀邊流式輸出?

文件輸入和流式可以搭配,流式的寫法見 /guides/openai-api-streaming。

參考資料

  • OpenAI 官方:File inputs — https://developers.openai.com/api/docs/guides/file-inputs

Nathaniel 的更多內容

  1. 01

    Claude Code 處理大倉庫:怎麼讓它只看需要的目錄(子目錄 CLAUDE.md、claudeMdExcludes、deny 規則)

    倉庫太大,Claude Code 總在讀無關文件、讀進別的包的規則?本文按官方大倉庫指南講:從哪個目錄啟動、子目錄 CLAUDE.md、claudeMdExcludes、Read 的 deny 規則、worktree.sparsePaths、additionalDirectories,以及一份合併後的配置示例。

    Claude0
  2. 02

    Claude Code 在 CI 裏跑:從本機 claude -p 到 GitHub Actions 的完整例子(自動審 PR、控成本)

    一條線走完 Claude Code 的 CI 用法:先在本機用 claude --bare -p 配 --json-schema 跑通,再寫進 GitHub Actions 用 claude-code-action@v1 自動審 PR,最後加上 --max-turns、超時、並發限制來控成本,並附上常見故障的排查順序。

    Claude0
  3. 03

    Claude Code 自定義 subagent 實例:測試員、調試員、只讀調研員、只讀數據庫員怎麼寫

    四個可直接改的 subagent 實例:跑測試的 test-runner、找根因的 debugger、只讀調研員、用 PreToolUse hook 限成只讀 SQL 的 db-reader;講 tools、disallowedTools、model、maxTurns 怎麼配,怎麼點名調用。

    Claude0
  4. 04

    Claude Code 的 CLAUDE.md 模板:前端、後端、數據分析各一份,附拆分與自檢方法

    直接拿去改的三份 CLAUDE.md 模板(前端、後端、數據分析),每份都控制在官方建議的 200 行以內;再講怎麼用 .claude/rules 的 paths 拆出專屬規則、用 @ 導入長文檔,以及用 /context all 和 /doctor prompt-audit 檢查是否生效。

    Claude0
  5. 05

    Claude Code 自己寫一個插件並發布到 marketplace:plugin.json、marketplace.json、validate 到團隊安裝的完整流程

    想把自己寫的 Skill、Hook 打包給團隊用?按 Claude Code 官方 Plugins 文檔,從目錄結構、plugin.json、claude plugin validate,到寫 marketplace.json、推到 Git、讓同事一條命令安裝,再到版本更新,走完一遍完整流程。

    Claude0
  6. 06

    Claude Code 寫一個會自動觸發的 Skill:從需求到觸發,用 description、when_to_use 和 paths 控制它什麼時候出場

    寫好的 Skill 總是不觸發,或者什麼都觸發?本文按 Claude Code 官方「Extend Claude with skills」走一遍完整實例:把「改數據庫遷移前先檢查」寫成一個會自動出場的 Skill,包含 description、when_to_use、paths、附帶腳本、觸發測試和評估。

    Claude0

同產品的其他教學

  1. 01

    ChatGPT 閃卡(flashcards)和互動小測(quizzes):是什麼、怎麼觸發、誰能用

    ChatGPT 現在能直接做可翻面的閃卡,也能在對話裏出題讓你作答。本文按官方發佈說明講這兩個功能是什麼、怎麼要求 ChatGPT 生成、閃卡怎麼翻面自評和儲存、各自在哪些套餐和裝置可用,並給出幾條自擬的提示詞寫法。

    ChatGPT0
  2. 02

    ChatGPT 手機端「切換帳號」(Switch account):同時登入兩個帳號怎麼加、怎麼切、哪些東西互不相通

    ChatGPT 的 iOS 和 Android 應用正在推送帳號切換:最多同時保持登入 2 個帳號,在 Settings > Switch account 裏添加、切換、退出。本文按官方幫助頁講步驟、限制、通知、訂閱歸屬,以及它和切換工作區的區別。

    ChatGPT0
  3. 03

    ChatGPT 鎖定對話(Locked chats):是什麼、怎麼開、誰能用,以及它不能做到什麼

    ChatGPT 的 Locked chats 能把指定對話從歷史、置頂和搜尋裏藏起來,用 4 位 PIN 或裝置驗證打開。本文講怎麼鎖、怎麼解鎖、忘了 PIN 的後果,以及官方明確說它不做的事(不是加密、不改保留期限)。

    ChatGPT0
  4. 04

    OpenAI API 聯網搜尋工具(web search)怎麼用:tools 裏加 web_search、引用來源、域名過濾和 external_web_access

    想讓 API 裏的模型先上網查再回答?在 Responses API 的 tools 裏加一項 web_search 即可。本文講輸出裏的 web_search_call 和 url_citation、域名過濾、用戶位置、查看全部來源、search_context_size 與離線緩存模式,以及官方列出的限制。

    ChatGPT0
  5. 05

    OpenAI API 的 token 怎麼算、怎麼估算費用:input_tokens 計數接口、tiktoken 和隱藏的輸出 token

    發請求前想知道會用多少 token?官方有 Responses 的 input_tokens 計數接口,能把文字、圖片、文件、工具定義一起算準;本地 tiktoken 只適合純文本。本文給 Python 和 Node 示例,講輸出 token 為什麼可能比看到的多,以及怎麼估算費用。

    ChatGPT0
  6. 06

    OpenAI API Node.js / TypeScript 快速上手:npm install openai、example.mjs 第一個請求,到流式、函數調用、聯網搜尋

    用 Node.js 調 OpenAI API:設定 OPENAI_API_KEY 環境變量,npm install openai,新建 example.mjs,用 client.responses.create 發出第一個請求。並列出圖片、文件、流式、函數調用、聯網搜尋和錯誤捕獲的 Node 寫法。

    ChatGPT0

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~