1

我有一段看起来像这样的代码,它在本地工作(不使用任何 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和使用文件对象,支持StringIOBytesIOstr对象?


注意:只是为了清楚起见,与原始问题无关。MyStringIO是添加的子StringIO.StringIO__len__

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

4

0 回答 0