Python请求SharePoint下载xlsx文件返回200但本地文件损坏无法打开
核心原因
- 状态码200仅代表请求得到正常响应,不代表返回的是xlsx二进制内容。绝大多数情况是返回了SharePoint的身份验证跳转页、文件预览页的HTML内容,你用记事本打开本地损坏的test.xlsx就能看到HTML源码,而非乱序的二进制内容。
- 企业SharePoint默认不支持HTTPBasicAuth认证,你使用的认证方式不匹配。
- 你填入的
file链接大概率是文件预览页地址,不是文件的直接下载链接。
修复步骤
1. 先验证返回内容
在现有代码的请求逻辑后加一行代码,确认返回内容格式:
# 输出前500个字符判断是否为HTML print(resp.text[:500])
如果输出包含<html>、<head>这类标签,就符合上述返回网页的问题。
2. 修正文件下载链接
在SharePoint站点找到目标文件,右键选择「复制链接」,将链接中的?web=1这类预览参数删掉,得到纯文件直链。
3. 替换适配的认证方式
企业本地部署的SharePoint一般使用NTLM认证,先安装对应依赖:pip install requests_ntlm
修正后的代码如下:
import requests from requests_ntlm import HttpNtlmAuth # 替换为实际的文件直链 file_url = "替换为你拿到的SharePoint文件直链" username = '你的域名\\你的用户名' # 注意域名和用户名之间用双反斜杠 password = '你的密码' resp = requests.get(file_url, auth=HttpNtlmAuth(username, password)) # 验证返回内容类型是否为xlsx,正常返回值为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet print(resp.headers.get('Content-Type')) with open('test.xlsx', 'wb') as f: f.write(resp.content)
4. Office 365 SharePoint Online 适配
如果你使用的是线上版SharePoint Online,需要安装专用库:pip install Office365-REST-Python-Client
对应代码示例:
from office365.runtime.auth.user_credential import UserCredential from office365.sharepoint.client_context import ClientContext site_url = "你的SharePoint站点地址" # 站点内的文件相对路径,比如/Shared Documents/test.xlsx file_relative_url = "替换为文件相对路径" username = "你的账号" password = "你的密码" ctx = ClientContext(site_url).with_credentials(UserCredential(username, password)) response = ctx.web.get_file_by_server_relative_url(file_relative_url).download() with open("test.xlsx", "wb") as f: f.write(response)
内容的提问来源于stack exchange,提问作者Sajena
相关产品推荐
相关产品推荐

