2009-01-06 9 views
5

Otrzymujemy dane POST z xml + dowolnych plików binarnych (takich jak obrazy i dźwięki) z urządzenia, które daje nam tylko kodowanie wieloczęściowe/mieszane.Czy cherrypy może odbierać wielostronicowe/mieszane testy POST po wyjęciu z pudełka?

Przygotowałem handlerka cherry/POST dla naszego odbiornika. Udało mi się zezwolić na wykonywanie dowolnej liczby parametrów przy użyciu wieloczęściowych/formularzy danych. Jednak gdy próbujemy wysłać dane wieloczęściowe, nie otrzymujemy żadnego przetwarzania.

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

Podczas przesyłania danych wieloczęściowych/formularzy, wartości args i kwargs są dobrze zdefiniowane.
args są polami formularza, kwargs = hash vars i wartości. Po przesłaniu wieloczęściowego/mieszanego, args i kwargs są puste, a ja po prostu mam cherrypy.request.rfile jako surową informację POST.

Moje pytanie brzmi, czy cherrypy ma wbudowany moduł obsługi obsługujący kodowanie wieloczęściowe/mieszane i kodowane dla POST? Czy będę musiał zastąpić cherrypy.tools.process_request_body i przetasować własny dekoder?

Wygląda na to, że wbudowany serwer wsgi z cherrypy obsługuje to jako część specyfikacji HTTP/1.1, ale nie mogłem znaleźć dokumentacji w cherrypy w uzyskiwaniu dostępu do tej funkcji.


... wyjaśnienie

Używam najnowszej wersji 3.1.1 lub tak CherryPy.

Tworzenie formularza domyślnego wymaga jedynie wprowadzenia parametrów w funkcji przesyłania.

Dla multipart/form-data, byłem nazywając curl -F [email protected] -F param2 = Jakiś tekst -F [email protected] http://destination:port/upload

W tym przykładzie, mam :

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

Gdy próbuje przesłać wieloczęściowy/mieszany, próbowałem patrząc na request.body, ale trzymane na coraz Brak za to, niezależnie od ustawienia przetwarzania ciała.

Wejście jesteśmy coraz kapie jak to:

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> 

Mam podkradające podejrzenie, że wieloczęściowy/mieszany jest problem, że CherryPy jest po prostu daje mi tylko rfile. Naszym celem jest, aby cherrypy przetwarzał ciało na jego części przy minimalnym przetwarzaniu po stronie odbiorczej (tj. Niech wiśnie robią swoją magię). Jeśli to wymaga, abyśmy byli ostrzejsi w formacie wysyłania, aby być typem treści, który lubi wisielec, to niech tak będzie. Jakie są akceptowane formaty? Czy to tylko wieloczęściowe/formularzy danych?

+0

jakiej wersji cherrypy i czy można utworzyć przykładowy formularz HTML? – llimllib

+0

Zamiast rfile, spójrz na cherrypy.request.body, gdy Content-Type nie jest formą danych. – fumanchu

Odpowiedz

5

Moja zła. Ilekroć Content-Type jest typu "multipart/*", CP próbuje wkleić zawartość do request.params (jeśli jest jakikolwiek inny Content-Type, przechodzi do request.body).

Niestety, CP założył, że każda wiadomość wieloczęściowa jest danymi formularza i nie zawierała żadnych innych podtypów. Właśnie naprawiłem to w bagażniku i powinno to zostać wydane w wersji 3.1.2. Przepraszam za niedogodności. W krótkim czasie możesz spróbować zastosować zestaw zmian lokalnie; patrz http://www.cherrypy.org/ticket/890.

+0

Hej, dzięki, to działało jak czar. Teraz można z łatwością wyciągnąć wszystkie części z cherrypy.request.params ['parts']. Dzięki! – dmyung

+0

Szukam tej samej odpowiedzi i znalazłem to: http://svn.cherrypy.org/trunk/cherrypy/_cpreqbody.py. Wyjaśnia, w jaki sposób cherrypy obsługuje dane wieloczęściowego postu za pomocą surowych bajtów, ale nie rozumiem, jak samemu rozwiązać ten problem. –

+1

W jaki sposób zapisać te przychodzące rzeczy: [, ], na dysk jako plik lokalny? –

Powiązane problemy