2009-01-06 50 views
5

我們從一個只支持多部分/混合編碼的設備接收一些xml +任意二進制文件(比如圖像和音頻)的POST數據。可以cherrypy收到多部分/混合POSTs的框?

我已經爲接收端設置了一個cherrypy上傳/ POST處理程序。我已經設法允許它使用multipart/form-data來執行任意數量的參數。但是,當我們嘗試發送多部分混合數據時,我們沒有得到任何處理。

@cherrypy.expose 
def upload(self, *args,**kwargs): 
    """upload adapted from cherrypy tutorials 

    We use our variation of cgi.FieldStorage to parse the MIME 
    encoded HTML form data containing the file.""" 

    print args 
    print kwargs 

    cherrypy.response.timeout = 1300 

    lcHDRS = {} 
    for key, val in cherrypy.request.headers.iteritems(): 
     lcHDRS[key.lower()] = val 
    incomingBytes = int(lcHDRS['content-length']) 

    print cherrypy.request.rfile 

    #etc..etc... 

因此,提交的multipart/form-data的時,指定參數和kwargs被很好的定義。
args是表單字段,kwargs =變量和值的散列。 當我提交多部分/混合,args和kwargs是空的,我只有cherrypy.request.rfile作爲原始的POST信息。

我的問題是,櫻桃有一個內置的處理程序來處理POST的多部分/混合和分塊編碼?或者我需要重寫cherrypy.tools.process_request_body並推出我自己的解碼器?

似乎內置的wsgi服務器與cherrypy把它作爲HTTP/1.1規範的一部分,但我似乎無法在cherrypy中找到訪問此功能的文檔。


...澄清

我使用的是最新版本3.1.1左右的CherryPy的。

製作默認表單只涉及在上傳功能中創建參數。

對於多/ form-data的,我一直在呼籲捲曲-F [email protected] -F參數2 = sometext -F [email protected] http://destination:port/upload

在這個例子中,我得到:

args = ['param1','param2','param3] 
kwargs = {'param1':CString<>, 'param2': 'sometext', 'param3':CString<>} 

當試圖提交多部分/混合,我試着看request.body,但保留在得到沒有的,無論定身處理。

我們現在要輸入進來的,因爲這:

user-agent:UNTRUSTED/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 
content-language:en-US 
content-length:565719 
mime-version:1.0 
content-type:multipart/mixed; boundary='newdivider' 
host:192.168.1.1:8180 
transfer-encoding:chunked 



--newdivider 
Content-type: text/xml 

<?xml version='1.0' ?><data><Stuff>.... 
etc...etc... 

--newdivider 
Content-type: image/jpeg 
Content-ID: file://localhost/root1/photos/Garden.jpg 
Content-transfer-encoding: binary 

<binary data> 

我有一個鬼鬼祟祟的懷疑,多/混合是CherryPy的只是給我正好的RFile問題。我們的目標是通過在接收端進行最小化處理(即,讓cherrypy發揮它的魔力),讓cherrypy處理它的各個部分。如果這需要我們更強硬的發送格式爲cherrypy喜歡的內容類型,那就這樣吧。什麼是可接受的格式?它只是多部分/形式數據嗎?

+0

什麼版本的cherrypy,你能製作一個示例HTML表單嗎? – llimllib 2009-01-06 04:00:08

+0

而不是rfile,看看cherrypy.request。當Content-Type不是表單數據時。 – fumanchu 2009-01-06 18:15:32

回答

5

我的不好。無論何時Content-Type是「multipart/*」類型,CP都會嘗試將內容粘貼到request.params中(如果有其他Content-Type,它將進入request.body)。

不幸的是,CP已經假設任何多部分消息都是表單數據,並且沒有爲其他子類型做準備。我剛剛解決了這個問題,它應該在3.1.2中發佈。抱歉給你帶來不便。在短期內,您可以嘗試在本地應用變更集;請參閱http://www.cherrypy.org/ticket/890

相關問題