2

私のWebサーバーは、TwitterのFinagleライブラリを使用してScalaで作成されています。このライブラリは、Nettyに依存しています。そのため、リクエストの内容はDynamicChannelBufferとして返されます。次のようにターミナルからcurlを使用してサーバーに画像をアップロードすると、次のようになります。

 curl -T "abc.jpg" http://127.0.0.1:8080/test/image

次に、次のようなSOAPパケットを使用して、画像を読み取り、バックエンドWebサーバーに転送できます。

      <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Header>
          <AuthHeader xmlns="http://www.testtesttest.co.za/">
            <LogonID>testtesttest</LogonID>
            <Password>testtesttest</Password>
          </AuthHeader>
        </soap:Header>
        <soap:Body>
          <uploadFile xmlns="http://www.testtesttest.co.za/">
            <FileDetails>
               <FileName>image.jpg</FileName>
              <FileContents>
                 {(Base64.encode(request.getContent())).toString(UTF_8)
              </FileContents>
            </FileDetails>
          </uploadFile>
        </soap:Body>
      </soap:Envelope>

上記の例では、コード:(Base64.encode(request.getContent())).toString(UTF_8)はリクエストコンテンツをbase64でエンコードされた文字列に変換します。

問題は、PhoneGapモバイルアプリから送信されたMultipartHttpリクエストから画像コンテンツを読み取る必要があることです。PhoneGapには、画像のみを送信するオプションがなく、マルチパートリクエストとしてファイルのアップロードを行うように要求されます。

マルチパートリクエストを分割するには、toString(UTF_8)を使用してrequest.getContent()の結果を文字列に変更し、httpマルチパートメッセージを個別のチャンクに分割して画像データパートを取得します。

 var requestParts = request.content.toString(UTF_8).split("\\Q--*****org.apache.cordova.formBoundary\\E")
 val imageParts = requestParts(3).split("\\n\\s*\\n")
 val imageHeader = imageParts(0)
 val imageBody = imageParts(1)

これはくだらないことですが(後で改善します)、今のところはうまくいきます。imageBodyには、画像コンテンツが文字列として含まれるようになりました。

ここで、imageBodyをSOAPパケットに戻す場合は、次を使用して再度エンコードする必要があります。

 val encoder = new BASE64Encoder();
 val encodedImage = encoder.encode(imageBody)

この時点で、画像は文字化けしています。サイズは正しいように見えますが、文字列の変換またはエンコードで何かを台無しにしています。最初の例では、Nettyのエンコーダーを使用していますが、2番目の例では、標準のJavaエンコーダーを使用しています。その理由は、NettyのエンコーダーはChannelBufferタイプのオブジェクトしかエンコードできないためです。

あまり大声で言いたくないのですが、1日以上苦労しています。ここでの助けは大歓迎です。

4

1 に答える 1

0

したがって、これは機能します。

image --> [curl] ------> post1 -->  [your code] --> soap msg 1 --> [back-end]

これはしません:

image --> [phonegap] --> post2 -->  [your code] --> soap msg 2 --> [back-end]

このタイプの問題を確実に解決するには、各ステップでどのエンコーディングが使用されているかを理解する必要があります。

同じ画像を使用できると仮定して、post1とpost2の生のエンコードされたコンテンツを確認し、どのエンコードが使用されているかを推測できますか?次に、それを理解したら、メッセージをデコードして再コード化するときに、コードにコンテンツを記録します。そうすれば、 soapmsg1soapmsg2で同じであることを確認できます。

于 2012-04-26T13:51:43.240 に答える