【问题标题】:Excel file corrupted after uploading to Sharepoint with Python使用 Python 上传到 Sharepoint 后 Excel 文件损坏
【发布时间】:2014-07-31 11:30:08
【问题描述】:

我正在尝试使用 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)

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

【问题讨论】:

  • 什么是响应头?

标签: python excel sharepoint


【解决方案1】:

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

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryNTIFeyYj307EY4HV 

例如,尝试发送带有“fcvsdcvsd”文本的 .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)

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

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

fcvsdcvsd

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

【讨论】:

  • urllocation 变量中有什么?还有token?
  • 是的,代码可以稍微清理一下,但这个解决方案对我有用。谢谢!将方法保留为 POST 对我来说很重要。
【解决方案2】:

我从你所做的开始,我得到了同样的错误。当我仔细查看损坏的文件时,我发现它的顶部包含 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    相关资源
    最近更新 更多