使用twisted来处理文件

时间:2012-07-18 15:43:18

标签: python xml twisted file-transfer

我正在尝试设置一个扭曲的xmlrpc服务器,该服务器将接受来自客户端的文件,处理它们,然后返回文件和结果字典。

我之前使用过python,但从来没有使用过扭曲的库。对于我的目的,安全性是一个非问题,而ssh协议似乎有点过分。它在Windows服务器上也有问题,因为termios不可用。

所以我的所有研究都指出xmlrpc是实现这一目标的最佳方式。但是,有两种文件传输方法可用。使用xml binary data方法或http request方法。

文件最多可以达到几百兆,那么我应该使用哪种方法?我很感激示例代码,因为我找不到带有twisted的文件传输文件。

更新

因此,使用xmlrpclib.Binary序列化文件似乎不适用于大文件,或者我使用它错了。测试代码如下:

from twisted.web import xmlrpc, server

class Example(xmlrpc.XMLRPC):
    """
    An example object to be published.
    """

    def xmlrpc_echo(self, x):
        """
        Return all passed args.
        """
        return x

    def xmlrpc_add(self, a, b):
        """
        Return sum of arguments.
        """
        return a + b

    def xmlrpc_fault(self):
        """
        Raise a Fault indicating that the procedure should not be used.
        """
        raise xmlrpc.Fault(123, "The fault procedure is faulty.")

    def xmlrpc_write(self, f, location):
        with open(location, 'wb') as fd:
            fd.write(f.data)

if __name__ == '__main__':
    from twisted.internet import reactor
    r = Example(allowNone=True)
    reactor.listenTCP(7080, server.Site(r))
    reactor.run()

客户端代码:

import xmlrpclib
s = xmlrpclib.Server('http://localhost:7080/')
with open('test.pdf', 'rb') as fd:
    f = xmlrpclib.Binary(fd.read())
s.write(f, 'output.pdf')

我测试时得到xmlrpclib.Fault: <Fault 8002: "Can't deserialize input: ">。是因为文件是pdf吗?

1 个答案:

答案 0 :(得分:1)

XML-RPC是文件传输的不良选择。 XML-RPC要求以XML支持的方式对文件内容进行编码。这在运行时成本和网络资源方面都很昂贵。相反,尝试使用普通的旧HTTP进行POSTing或PUTing文件。