6

マルチパート/混合エンコーディングのみを提供するデバイスから、xml +任意のバイナリファイル(画像やオーディオなど)のPOSTデータを受信して​​います。

レシーバー側に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を送信する場合、argsとkwargsは明確に定義されています。
argsはフォームフィールドであり、kwargs=varsとvaluesのハッシュです。multipart / mixedを送信すると、argsとkwargsは空になり、生のPOST情報としてcherrypy.request.rfileがあります。

私の質問は、cherrypyにはPOSTのマルチパート/混合およびチャンクエンコーディングを処理するための組み込みハンドラーがありますか?または、cherrypy.tools.process_request_bodyをオーバーライドして、独自のデコーダーをロールする必要がありますか?

Cherrypyを備えた組み込みのwsgiサーバーがこれをHTTP/1.1仕様の一部として処理しているようですが、この機能にアクセスする際にcherrypyのドキュメントが見つからなかったようです。


...明確にするために

Cherrypyの最新バージョン3.1.1程度を使用しています。

デフォルトのフォームを作成するには、アップロード関数でパラメーターを作成するだけです。

multipart / form-dataについては、curl -F param1 = @ file1.jpg -F param2 = sometext -F param3 = @ file3.wav http:// destination:port/uploadを呼び出しています。

その例では、次のようになります。

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

multipart / mixedを送信しようとしたときに、request.bodyを確認しようとしましたが、ボディ処理の設定に関係なく、Noneを取得し続けました。

私たちが得ている入力は次のようになります:

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>

multipart / mixedは、cherrypyがrfileだけを私に与えているという問題であるというこっそりの疑いがあります。私たちの目標は、受信側で最小限の処理で、cherrypyにボディをパーツに処理させることです(つまり、cherrypyに魔法をかけてもらいます)。そのために、送信形式をcherrypyが好むコンテンツタイプにするのが難しい場合は、そうしてください。受け入れられるフォーマットは何ですか?multipart / form-dataだけですか?

4

1 に答える 1

4

私の悪い。Content-Type のタイプが「multipart/*」の場合は常に、CP は内容を request.params に貼り付けようとします (他の Content-Type がある場合は、request.body に入ります)。

残念ながら、CP はあらゆるマルチパート メッセージがフォーム データであると想定しており、他のサブタイプについては規定していません。これをトランクで修正したところ、3.1.2 でリリースされるはずです。ご不便おかけしてすみません。短期的には、変更セットをローカルに適用してみることができます。http://www.cherrypy.org/ticket/890を参照してください。

于 2009-01-08T01:55:49.673 に答える