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 条评论

登录 后参与评论

还没有评论,来抢沙发~