私の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日以上苦労しています。ここでの助けは大歓迎です。