我的 Web 服务器是使用 Twitter 的 Finagle 库用 Scala 编写的,而后者又依赖于 Netty。因此,请求内容作为 DynamicChannelBuffer 返回。如果我从终端使用 curl 将图像上传到服务器,如下所示:
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)
将请求内容转换为 base 64 编码字符串。
问题是我需要从 PhoneGap 移动应用程序发送的 Multipart Http 请求中读取图像内容。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 的编码器,但对于第二个示例,我使用的是标准的 java 编码器。原因是 Netty 的编码器只能对 ChannelBuffer 类型的对象进行编码。
我不想说得太大声,但我已经为此苦苦挣扎了一天多。非常感谢这里的任何帮助。