将StringIO发送到Twisted FileSender

时间:2015-03-20 18:38:30

标签: python twisted

我正在尝试将一些图像数据发送到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)

1 个答案:

答案 0 :(得分:3)

当您尝试发送时,StringIO位于EOF。令人惊讶的是它甚至发送了几个字节(我怀疑它没有,你只是看到HTTP框架)。在致电beginFileTransfer之前尝试寻找开头。

此外,您并不需要在此处使用FileSender。您的数据已完全在内存中。 FileSender实际上可能会增加发送费用。相反,您可能会考虑更简单:

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