2012-07-18 59 views
2

我试图设置一个扭曲的xmlrpc服务器,它将接受来自客户端的文件,处理它们,并返回文件和结果字典。使用twisted来处理文件

我以前用过python,但从来没有扭曲过的库。为了我的目的,安全性不是问题,ssh协议看起来好像过度。它在windows服务器上也有问题,因为termios不可用。

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

无论哪种方式,文件可以达到几百megs,所以我应该使用哪种方法?示例代码表示赞赏,因为我找不到通过xml文件传输的扭曲文档。

更新:

如此看来,与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

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

+0

啊,但我需要做的东西到文件,然后返回修改后的文件。我如何用POST请求发送选项,然后返回结果文件? – 2012-07-18 17:41:40

+0

HTTP请求可以有响应。将结果文件发送回应答。 HTTP请求也有一个请求的URL,头文件和一个任意的主体。你可以坚持这些“选项”在任何这些。 URL中的查询参数是一种流行的简单选项。 – 2012-07-18 17:47:27

+0

Argle!我通常不是网络人,所以所有可用的工具都是新的。我也想在大约4个小时内完成这件事。所以,我要去阅读关于HTTP请求的扭曲的文档,然后我将会看到一个例子,我会感激你。 – 2012-07-18 17:51:00