问题URL在python中编码二进制文件

时间:2013-09-06 20:32:58

标签: python base64 urllib binaryfiles

所以我正在执行的过程对我来说似乎有道理,但我一直都会遇到错误。所以我有这个二进制文件,我正在尝试发送到服务器(Shapeways确切。它是一个二进制的3D模型文件)所以我通过这个过程使其在URL中可以接受

theFile = open(fileloc,'rb')
contents = theFile.read()
b64 = base64.urlsafe_b64encode(contents)
url = urllib.urlencode(b64)  # error

问题是最后一行总是抛出错误

TypeError: not a valid non-string sequence or mapping object

这对我来说没有意义,因为数据被假设为URL编码。是否有可能只包含其他未编码的字符或类似的字符?

2 个答案:

答案 0 :(得分:2)

urllib.urlencode将一系列两元素元组或字典序列化为一个URL查询字符串(它基本上摘自docstring),但您只是作为参数传递一个字符串。

你可以尝试这样的事情:

theFile = open(fileloc,'rb')
contents = theFile.read()
b64 = base64.urlsafe_b64encode(contents)
url = urllib.urlencode({'shape': b64})

但是你在url变量中得到的只是编码参数,所以你仍然需要实际的url。如果您不需要低级操作,最好使用requests库:

import requests
import base64

url = 'http://example.com'
r = requests.post(
    url=url,
    data={'shape':base64.urlsafe_b64encode(open(fileloc, 'rb').read())}
)

答案 1 :(得分:1)

如果您只是尝试将文件发送到服务器,则不需要对其进行urlencode。使用POST请求发送。

您可以使用urllib2,也可以使用requests lib,这可以简化一些事情。

This SO线程也可以为您提供帮助。