thinkphp无法直接上传到百度网盘,因其内置filesystem仅支持本地磁盘;必须通过百度开放平台api手动实现:先临时存本地,再调用预上传/分片上传接口,最后清理临时文件,并严格完成oauth2.0授权链与token管理。

ThinkPHP 本身不提供百度网盘对接能力,必须通过百度网盘开放平台 API 手动集成;直接调用 Filesystem::disk('public') 或 $file->move() 只能操作本地服务器文件,和百度网盘完全无关。
为什么不能用 ThinkPHP 内置上传直接存到百度网盘
ThinkPHP 的 Request::file() 和 Filesystem 操作对象始终是本地磁盘路径(如 ./public/uploads/),它们没有内置对百度网盘 REST 接口的封装。所谓“上传到百度网盘”,本质是:先接收用户文件 → 临时存本地 → 调用百度网盘 /rest/2.0/file/upload 或分片上传接口 → 把文件内容推到百度服务器 → 最后清理本地临时文件。
常见错误现象:
- 代码里写了
Filesystem::disk('baidu')->put(...),但没定义baidu磁盘驱动 → 报错Undefined disk [baidu] - 误以为调用
move()到某个远程路径就能生效 → 实际只是尝试写入本地不存在的目录,报failed to open stream: No such file or directory - 用
curl直接发请求但没带access_token或签名 → 返回{"error":"invalid_access_token","error_description":"token is invalid"}
必须完成的三步授权链:code → access_token → refresh_token
百度网盘开放平台强制要求 OAuth 2.0 授权流程,跳不过。即使你只给自己用,也得走完整流程,否则所有 API 调用都会被拒绝。
关键点:
调用百度PaddleOCR‑VL大模型API,支持PDF、Word、PPT、图片等多格式文档解析,精准识别印刷体、手写体、表格、公式、图表、印章等复杂元素,支持100+语言,可处理不规则布局和跨页长文档。触发词:文档解析、VLM解析、大模型OCR、PaddleOCR、多模态文档、手写识别、公式识别、复杂版面。
-
client_id和client_secret来自你在 百度网盘开放平台 创建的应用,不是百度账号密码 - 回调地址
redirect_uri必须和控制台配置**完全一致**(含末尾斜杠),且公网可访问;开发时可用http://localhost:8000/callback,但需确保 Nginx/Apache 转发到位 - 获取
access_token后,它默认 30 天过期;必须同时保存refresh_token,用它换新access_token,否则用户隔月就得重新扫码授权 - 每次调用 API(如上传、离线下载)都必须在请求头或参数中带上
access_token=xxx,漏掉就 401
离线下载任务提交:用 /services/cloud_dl 不再支持,改用 /rest/2.0/offlinedownload/add_task
旧教程里常见的 http://pan.baidu.com/rest/2.0/services/cloud_dl?... 地址已失效(返回 {"error_code":110,"error_msg":"Method not found"})。当前唯一有效接口是 /rest/2.0/offlinedownload/add_task,且仅接受 POST + JSON body。
实操要点:
- 请求必须带
access_token参数(URL query 或 form-data 均可),不能只放 header - body 是 JSON,字段必须为:
{"source_url":"magnet:?xt=...","save_path":"/我的资源/","type": "1"};type=1表示磁力链接,type=2表示 BT 种子(需额外传torrent字段) -
save_path必须以/开头,且目标文件夹需已存在;百度不会自动创建多级目录,/影视/2026/不存在就会失败 - 响应成功返回
{"task_id":"xxxxxx","errno":0},后续查状态要用这个task_id调/rest/2.0/offlinedownload/query_task
文件上传:小文件直传 vs 大文件必须分片
百度网盘对单次上传有严格限制:HTTP body 超过 2MB 就会拒绝(返回 {"error_code":31071,"error_msg":"upload data too large"})。所以不能无脑 file_get_contents($tmpFile) 发过去。
正确路径分两种:
-
≤2MB 文件:走预上传 + 表单直传。先调
/rest/2.0/file/precreate获取upload_id和block_list,再用multipart/form-data向https://c3.qianqian.com/.../upload地址 POST 文件二进制(注意 boundary 和 Content-Disposition) -
>2MB 文件:必须分片。先调
precreate,再循环调/rest/2.0/file/upload上传每个块(partseq从 1 开始),最后调/rest/2.0/file/create合并。每片大小建议 4MB,太多易超时,太少增加请求数 - 无论哪种,最终
create接口的path字段值必须是绝对路径,如/文档/报告.pdf,且父目录得提前存在
最易忽略的一点:所有上传相关接口(precreate、upload、create)的 access_token 必须和离线下载用的是同一个 token —— 百度不认跨账号 token,也不认过期 token。别把上传用的 token 和登录态混为一谈。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










