使用Python上传到Sharepoint后,Excel文件损坏

Luc*_*iko 6 python excel sharepoint

我正在尝试使用Python中的“请求”模块将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)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?任何帮助或见识将不胜感激!

Ayr*_*rat 2

问题: 问题是 Sharepoint 需要来自您的请求的二进制数据。但是您正在发送某种批次的数据。当您发出请求时,python-requests 库会自动添加到标头

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryNTIFeyYj307EY4HV 
Run Code Online (Sandbox Code Playgroud)

例如,尝试发送其中包含“fcvsdcvsd”文本的 .txt 文件。当您将此文件上传到 Sharepoint 站点时,您将收到不同的文件。这是我上传该文件时在 Sharepoint 文件存储库中得到的信息:

------WebKitFormBoundaryCGYE31vAG1tfvbzV
Content-Disposition: form-data; name="fileUpload1"; filename="testtest.txt"
Content-Type: text/plain

fcvsdcvsd
------WebKitFormBoundaryCGYE31vAG1tfvbzV-- 
Run Code Online (Sandbox Code Playgroud)

就您而言,这些行也添加到您的文件中。当 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)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我在请求正文(“数据参数”)中以二进制(“内容”)形式发送文件,内容类型定义为“application/x-www-urlencoded; charset=UTF-8”

这是我以二进制形式发送的 txt 文件

fcvsdcvsd
Run Code Online (Sandbox Code Playgroud)

url变量是您的 Sharepoint 服务器网关所在的 url(?)。 location变量是要添加新文件 “X-RequestDigest”的路径:如果您有权访问 Sharepoint 服务器,则 token 是可选参数。