requests上传文件返回401/403主因是缺失认证态,需用session保持cookie、补全x-csrftoken等头;中文文件名须显式传元组指定filename;大文件应走网盘分片接口而非硬传;同步需比对mtime或hash,禁用默认删除。

Requests上传文件时为什么总是返回401或403?
多数企业网盘(如自建Seafile、Nextcloud、或定制化WebDAV接口)要求带认证头或会话态,单纯用requests.post(url, files={...})会因缺失登录态被拒绝。不是接口写错了,是没复现浏览器真实请求链路。
实操建议:
- 先用浏览器开发者工具抓包,找到「登录成功后」的上传请求,重点看
Cookie、X-CSRFToken、Authorization这三个字段是否携带 - 若登录接口返回
Set-Cookie,必须用requests.Session()对象,否则Cookie不会自动带上后续请求 - Nextcloud类系统通常需要额外传
headers={'OCS-APIRequest': 'true'},缺了就403 - Seafile Web API需在URL里显式加
?p=/path/to/file并POST到/api2/repos/{repo_id}/upload-link/获取临时上传地址,再用那个地址发真正的文件POST
如何正确构造files参数避免中文文件名乱码?
直接传files={'file': open('测试.pdf', 'rb')}会导致服务端收到的文件名是%E6%B5%8B%E8%AF%95.pdf甚至空字符串——这不是编码问题,是requests默认不设filename字段,服务端无法解析原始名。
实操建议:
- 显式指定元组:
files={'file': ('测试.pdf', open('测试.pdf', 'rb'), 'application/pdf')} - 如果服务端强制要求UTF-8文件名(如某些Java后端),把文件名encode成bytes再decode('latin1')绕过requests内部编码转换:
filename.encode('utf-8').decode('latin1') - 避免使用
pathlib.Path.open()直接传入files,容易触发资源未关闭;改用上下文管理或提前读取bytes再传
大文件上传中断后怎么续传?Requests本身不支持,但可以绕过
Requests没有内置分块上传或断点续传,但企业网盘接口往往提供独立的「分片上传」能力(如Nextcloud的/remote.php/webdav/配合Tus-Resumable头,或Seafile的/api2/repos/{id}/uploaded_bytes/)。硬用requests.put()传整个文件只会失败重来。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
实操建议:
- 优先查目标网盘文档,确认是否支持TUS协议;支持的话,用
pytus库比手撸requests更稳 - 若只支持普通POST且文件超50MB,手动切片:
open(...).read(1024*1024*5)每次读5MB,拼JSON body带chunk_index和total_chunks,服务端自行合并 - 上传前先HEAD请求目标路径,检查
Content-Length是否已存在;若存在且大小一致,跳过上传
同步逻辑怎么避免重复上传和误删?
脚本不是上传器,是同步器。核心在于比对本地修改时间/大小与远端元数据,而非无脑覆盖。很多脚本跑一次就重新上传全部文件,既耗带宽又触发审计告警。
实操建议:
- 远端若提供
PROPFIND(WebDAV)或GET /api2/repos/{id}/dir/(Seafile),务必拉取完整目录列表,解析<getlastmodified></getlastmodified>或mtime字段,与os.path.getmtime()比对 - 不要依赖文件名唯一性:同名文件可能内容不同,必须校验
hashlib.md5(file_bytes).hexdigest()(小文件可全读,大文件读前1KB+后1KB) - 删除操作必须加开关控制(如
--dry-run或配置项allow_delete = false),生产环境默认禁止删远端
真正麻烦的从来不是上传动作本身,而是你怎么定义“这个文件已经同步好了”。时间戳精度、时区、服务端是否忽略If-Modified-Since头、NFS挂载导致stat结果异常……这些细节比写一个POST请求花的时间多十倍。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










