2012-04-26 7 views
2

私のWebサーバーは、TwitterのFinagleライブラリを使用してScalaで書かれています。これはNettyに依存しています。したがって、要求コンテンツはDynamicChannelBufferとして返されます。私はこのようなターミナルからカールを使用してサーバーに画像をアップロードした場合:NettyのDynamicChannelBufferをStringに変更してからChannelBufferに戻す

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

をそれから私は読んで、次のようになりますSOAPパケットを使用してバックエンドのウェブサーバに画像を転送することができます。

 <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)は、要求の内容をベース64のエンコードされた文字列に変換します。

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

離れてマルチパートリクエストを破るために、私は(request.getContentを変更)のtoString(UTF_8)を使用して文字列になり、その後、それは別の塊だに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はイメージコンテンツを文字列として持つようになりました。私は戻ってSOAPパケットにimageBodyを置けば

今、私が使用してそれを再度エンコードする必要があります。画像だけでごっちゃされる。この時点で

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

。サイズは正しいように見えますが、文字列の変換やエンコーディングで何か面倒です。最初の例ではNettyのエンコーダを使用していますが、2番目の例では標準のJavaエンコーダを使用しています。その理由は、Nettyのエンコーダは、ChannelBuffer型のオブジェクトのみをエンコードできるからです。

私はこれをあまりにも大声では言いたくはありませんが、私はこれ以上1日以上苦労しています。ここの助けは大いに感謝します。

+0

あなたの苦労のために+1 – virtualeyes

答えて

0

だから、これは動作します:

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

はこれはしていません:

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

を使用すると、各ステップで使用されているエンコーディングを理解する必要があり確実にこの種の問題を解決するために。

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

+0

ありがとうございます。私はあなたがそれを敷設する方法が好きです。それは少し頭を少しきれいにする。 PhoneGapからの同じ写真はカールのものと同じように醜く見えません。私の推測では、PhoneGapは舞台裏で多少の圧縮を行っていたが、はい、エンコードしている可能性があります。私はそれが文字列とバックに書いたのは私だと考え続けましたが、それは問題ではないかもしれません。 – Jack

関連する問題