我的web服務器是使用Twitter的Finagle庫在Scala中編寫的,該庫依靠Netty。因此,請求內容作爲DynamicChannelBuffer返回。如果我使用curl從終端上傳圖片到服務器這樣的:將Netty中的DynamicChannelBuffer更改爲字符串並返回到ChannelBuffer
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)
將請求內容轉換爲基本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現在具有圖像內容作爲字符串。現在
,如果我把imageBody回SOAP包,我要再次使用它編碼:
val encoder = new BASE64Encoder();
val encodedImage = encoder.encode(imageBody)
此時圖像只是斷章取義。它的尺寸看起來不錯,但是我正在用字符串轉換或編碼搞亂一些東西。對於第一個示例,我使用Netty的編碼器,但對於第二個示例,我使用的是標準Java編碼器。原因是Netty的編碼器只能編碼ChannelBuffer類型的對象。
我不想說這太大聲,但我一直在爲此掙扎超過一天。這裏的任何幫助將非常感謝。
+1爲你的奮鬥 – virtualeyes 2012-04-26 15:45:21