我有一段看起来像这样的代码,它在本地工作(不使用任何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
和文件对象的使用,转而支持StringIO
,BytesIO
或str
个对象?
注意:仅为了清楚起见,与原始问题无关。 MyStringIO
是StringIO.StringIO
的子类,其中添加了__len__
:
class MyStringIO(StringIO.StringIO):
def __len__(self):
return self.len