2012-07-18 40 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