【问题标题】:Changing DynamicChannelBuffer in Netty to String and back to ChannelBuffer将 Netty 中的 DynamicChannelBuffer 更改为 String 并返回 ChannelBuffer
【发布时间】:2012-04-26 08:48:41
【问题描述】:

我的 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类型的对象。

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

【问题讨论】:

    标签: scala cordova netty finagle


    【解决方案1】:

    所以这行得通:

    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 中是相同的。

    【讨论】:

    • 谢谢。我喜欢你布置的方式。它有点清醒。 PhoneGap 的同一张照片看起来不像 curl 的照片。我的猜测是 PhoneGap 在幕后做了一些压缩,但是是的,它也可能是它的编码。我一直在想是我写的字符串和回信,但也许这不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2010-12-28
    • 1970-01-01
    相关资源
    最近更新 更多