我正在尝试使用Python中的Requests模块将Excel文件从本地文件夹上传到Sharepoint。该文件将出现在我的共享文档文件夹中,这是我想要的文件夹,但是当我尝试打开文件时,我收到一条消息,说“您选择的工作簿无法打开。工作簿可能在不支持的文件格式,或者它可能已损坏。您要尝试在Excel中打开此文件吗?“
我已经研究过这个问题了,我发现的许多论坛都说过一个常见的问题就是文件中某个^符号前面有一个空格,但此刻,出于测试目的,我只是试图上传一个完全空白的文件,其中绝对没有任何内容。
这是我的代码:
files = {'file': ('Test.xlsx', open('Test.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
myFile = requests.put('http://linkToMySharepoint/Test.xlsx', files=files, auth=auth)
我做错了什么?任何帮助或见解将不胜感激!
答案 0 :(得分:1)
<强>问题:强> 问题是Sharepoint需要来自您请求的二进制数据。但是你要发送一些批量的数据。当您发出请求时,python-requests库会自动添加到标题
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryNTIFeyYj307EY4HV
例如尝试使用&#34; fcvsdcvsd&#34;发送.txt文件。其中的文字。当您将此文件上传到Sharepoint站点时,您将收到不同的文件。这是我上传该文件时在Sharepoint文件存储库中获得的内容:
------WebKitFormBoundaryCGYE31vAG1tfvbzV
Content-Disposition: form-data; name="fileUpload1"; filename="testtest.txt"
Content-Type: text/plain
fcvsdcvsd
------WebKitFormBoundaryCGYE31vAG1tfvbzV--
在您的情况下,这些行也会添加到您的文件中。当Excel尝试打开该文件时,它会找到这些行并在文件损坏时停止读取。
<强>解:强> 正如我之前所说,您需要在请求正文中将文件作为二进制文件发送。我就是这样做的
headers = {"accept": "application/json;odata=verbose",
"X-RequestDigest": token,
"content-type": "application/x-www-urlencoded; charset=UTF-8"}
with open(local_path, "rb") as read_file:
content = read_file.read()
r = requests.post(url + "getFolderByServerRelativeUrl('" + location + "')/files/add(overwrite=true,url='" + filename + "')",
data=content, auth=auth, headers=headers)
正如您所看到的,我将文件作为二进制文件(&#34;内容&#34;)发送到请求主体(&#34;数据参数&#34;),内容类型定义为&#34; application / x -www-urlencoded进行;字符集= UTF-8&#34;
这是我作为二进制发送的txt文件
fcvsdcvsd
url 变量是您的Sharepoint服务器网关所在的网址(?)。 位置变量是您要添加新文件的路径 &#34;如果您有权访问您的Sharepoint服务器,则X-RequestDigest&#34;:令牌是可选参数。
答案 1 :(得分:0)
我从你做了什么开始,我得到了同样的错误。当我仔细查看损坏的文件时,我发现它在顶部包含MIME元数据。这让我走上正轨。普通的PUT应该足够了。在下面找到一个最小的工作示例:
import requests
import os
import sys
from requests_ntlm import HttpNtlmAuth
filename = 'test.xlsx'
session = requests.Session()
session.auth = HttpNtlmAuth('YOURDOMAIN\\youraccount','yourpass', session)
file = open(filename, 'rb')
bytes = bytearray(file.read())
resp = requests.put('http://sharepoint.company.com/exampleurl/Archive%20%20old%20stuff/' + filename, data=bytes, auth=session.auth)
print(resp.status_code)