我有一段看起来像这样的代码,它在本地工作(不使用任何 AppEngine):
bodyParams = { "file" : open( filePath, "rb" ) }
request = urllib2.Request( requestUrl, None, self.buildAuthInfo() )
response = self.getOpener().open(request, bodyParams).read()
我想摆脱open
, ie 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