替换urllib2的二进制模式文件对象

时间:2012-07-22 05:47:37

标签: python google-app-engine curl urllib2 urllib

我有一段看起来像这样的代码,它在本地工作(不使用任何AppEngine):

bodyParams = { "file" : open( filePath, "rb" )  }
request = urllib2.Request( requestUrl, None, self.buildAuthInfo() )
response = self.getOpener().open(request, bodyParams).read()

我想摆脱open,即open( filePath, "rb" ),因为在Google AppEngine中禁止使用文件(或非常不方便)。

为了解决这个问题,我得到了base64编码图像文件的HTTP POST数据,我对其进行了解码。我使用以下命令通过cURL发送编码数据:

curl -X POST -F image=@encoded http://localhost:8080/image-process

encoded是base64编码的jpg。

此时,我尝试了两种不同的方法:将解码后的数据放入StringIO对象,或直接传递并使用内部bodyParams = { "file" : DECODEDVALUE}。我希望其中任何一个都可以工作,但我从目标服务器(我正在做外部API请求)收到HTTP 500错误。这是我解码值的方法:

img = self.request.get('image')
DECODEDVALUE = MyStringIO(base64.b64decode(img))

我相信我遇到了与编码和/或二进制模式有关的问题。我相信我遇到了与编码和/或二进制模式有关的问题。

如何摆脱open和文件对象的使用,转而支持StringIOBytesIOstr个对象?


注意:仅为了清楚起见,与原始问题无关。 MyStringIOStringIO.StringIO的子类,其中添加了__len__

class MyStringIO(StringIO.StringIO):
  def __len__(self):
    return self.len

0 个答案:

没有答案