私の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日以上苦労しています。ここの助けは大いに感謝します。
あなたの苦労のために+1 – virtualeyes