2

我的 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 类型的对象进行编码。

我不想说得太大声,但我已经为此苦苦挣扎了一天多。非常感谢这里的任何帮助。

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 中的原始编码内容并推断正在使用哪种编码?然后,当您理解这一点时,在您解码和重新编码消息时将内容记录在代码中。这样你就可以确保它在soap msg1soap msg2中是一样的。

于 2012-04-26T13:51:43.240 回答