关于编码:如何使用request.put()通过Python上传文件?

How do I use requests.put() to upload a file using Python?

我正在尝试使用Python中的请求库将文件上传到localhost上的Fedora commons存储库。我可以肯定我的主要问题是不了解open() / read()以及通过http请求发送数据所需要做的事情。

1
2
3
4
5
6
7
8
9
10
def postBinary(fileName,dirPath,url):
    path = dirPath+'/'+fileName
    print('to ' + url + '\
'
+ path)
    openBin = {'file':(fileName,open(path,'rb').read())}
    headers = {'Slug': fileName} #not important
    r = requests.put(url, files=openBin,headers=headers, auth=HTTPBasicAuth('username', 'pass'))
    print(r.text)
    print("and the url used:")
    print(r.url)

这将成功地将文件上传到存储库中,但是文件会稍大并且之后会损坏。例如,一个6.6kb的图像变成了6.75kb,无法再打开。

那么我应该如何使用put in python正确打开和上传文件呢?

###其他详细信息:###

  • 当用data=openBin替换files=openBin时,我得到了字典,并假定数据为字符串。我不知道这些信息是否有用。
    " file = FILE_NAME.extension


    已更新

    requests.put()files参数一起使用将发送多部分/表单数据编码的请求,即使声明了正确的内容类型,服务器也似乎无法在不破坏数据的情况下进行处理。

    curl命令仅对包含在请求正文中的原始数据执行PUT。您可以通过在data参数中传递文件数据来创建类似的请求。在标题中指定内容类型:

    1
    2
    headers = headers = {'Content-type': 'image/jpeg', 'Slug': fileName}
    r = requests.put(url, data=open(path, 'rb'), headers=headers, auth=('username', 'pass'))

    您可以根据需要更改Content-type标头以适合有效负载。


    尝试为文件设置Content-type

    如果确定它是文本文件,请尝试在curl命令中使用的text/plain-即使您似乎正在上载jpeg文件?但是,对于jpeg图像,应使用image/jpeg

    否则,对于任意二进制数据,可以使用application/octet-stream

    1
    openBin = {'file': (fileName, open(path,'rb'), 'image/jpeg' )}

    此外,也不必在代码中显式读取文件内容,requests将为您完成此操作,因此只需传递打开的文件句柄,如上所示。