将 StringIO 发送到 Twisted FileSender

Sending a StringIO to a Twisted FileSender

我正在尝试将一些图像数据发送到 Twisted 中的 FileSender。如果我使用临时文件保存图像,一切正常;

#works
img = Image(format='png', blob=base64.decodestring(dt))
img.save(filename='/tmp/tmp.png')
file = open('/tmp/tmp.png','rb')
filesender = FileSender().beginFileTransfer(file, request)

def fileFinished(ignored):
 request.finish()

filesender.addCallback(fileFinished)

但是我想做的是在内存中而不是在文件中执行此操作。我曾尝试使用 StringIO 来执行此操作,但 FileSender 似乎只发送了几个字节就放弃了。我做错了什么?

img = Image(format='png', blob=base64.decodestring(dt))
buffer = StringIO()
img.save(buffer)
filesender = FileSender().beginFileTransfer(buffer, request)

def fileFinished(ignored):
 request.finish()

filesender.addCallback(fileFinished)

当您尝试发送时,您的 StringIO 位于 EOF。令人惊讶的是它甚至发送了几个字节(我怀疑它没有发送,你只是看到了 HTTP 帧)。在调用 beginFileTransfer.

之前尝试查找开头

此外,您真的不需要在这里使用 FileSender。您的数据已经完全在内存中。 FileSender实际上可能会增加发送成本。相反,您可能会考虑更简单的方法:

request.write(buffer.getvalue())
request.finish()