2009-01-06 12 views
5

Stiamo ricevendo alcuni dati POST di xml + file binari arbitrari (come immagini e audio) da un dispositivo che fornisce solo codifiche multipart/misti.può cherrypy ricevere POST multipart/mixed out of the box?

Ho impostato un gestore di caricamento/POST di cherrypy per il nostro destinatario. Sono riuscito a permettergli di fare un numero arbitrario di parametri usando multipart/form-data. Tuttavia, quando proviamo a inviare i dati multipart-mixed, non riceviamo alcuna elaborazione.

@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... 

Così, quando si inoltrano multipart/form-data, args e kwargs sono ben definiti.
args sono i campi del modulo, kwargs = hash di vars e valori. Quando invio multipart/mixed, args e kwargs sono vuoti, e ho cherrypy.request.rfile come le prime informazioni POST.

La mia domanda è: cherrypy ha un gestore integrato per gestire la codifica multipart/mixed e chunked per il POST? O dovrò sovrascrivere il cherrypy.tools.process_request_body e rotolare il mio decodificatore?

Sembra che il server wsgi incorporato con cherrypy gestisca questo come parte della specifica HTTP/1.1, ma non riesco a trovare la documentazione in cherrypy per accedere a questa funzionalità.


... per chiarire

sto utilizzando la versione più recente 3.1.1 o così di CherryPy.

La creazione di un modulo predefinito comporta solo l'impostazione di parametri nella funzione di caricamento.

Per/form-data multipart, Ho chiamato ricciolo -F [email protected] -F param2 = -F someText [email protected] http://destination:port/upload

In questo esempio, ottengo :

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

Quando si tenta di inviare il multipart/mixed, ho provato a guardare il request.body, ma continuai a ottenere Nessuno per questo, indipendentemente dalle impostazioni del trattamento del corpo.

L'ingresso stiamo ottenendo è in arrivo come questo:

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> 

Ho un vago sospetto che il multipart/mixed è il problema che CherryPy è appena mi dà solo il rfile. Il nostro obiettivo è far sì che la cherrypy elabori il corpo nelle sue parti con una elaborazione minima sul lato ricevente (cioè lascia che la cherrypy faccia la sua magia). Se questo ci richiede di essere più duri nel formato di invio per essere un tipo di contenuto che piace alla cherrypy, allora così sia. Quali sono i formati accettati? È solo multipart/form-data?

+0

quale versione di cherrypy e puoi creare un modulo HTML di esempio? – llimllib

+0

Invece di rfile, guarda cherrypy.request.corpo quando Content-Type non è form-data. – fumanchu

risposta

5

Il mio male. Ogni volta che il Content-Type è di tipo "multipart/*", allora CP tenta di incollare il contenuto in request.params (se qualsiasi altro Content-Type, va in request.body).

Sfortunatamente, CP ha assunto che qualsiasi messaggio multipart è form-data e non ha previsto alcuna disposizione per altri sottotipi. Ho appena risolto questo problema nel trunk, e dovrebbe essere rilasciato in 3.1.2. Ci dispiace per l'inconvenienza. A breve termine, puoi provare ad applicare localmente il changeset; vedi http://www.cherrypy.org/ticket/890.

+0

Ehi, grazie, ha funzionato come un incantesimo. Ora puoi rimuovere tutte le parti dai cherrypy.request.params ['parti'] con facilità. Grazie! – dmyung

+0

Sto cercando la stessa risposta, e ho trovato questo: http://svn.cherrypy.org/trunk/cherrypy/_cpreqbody.py. Spiega come cherrypy gestisce i dati di post multiparte con byte non elaborati, ma non ho ancora capito come risolvere il problema. –

+1

Quindi, come faccio a salvare questa roba in arrivo: [, ], su disco come file locale? –

Problemi correlati