2012-04-26 24 views
2

我的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類型的對象。

我不想說這太大聲,但我一直在爲此掙扎超過一天。這裏的任何幫助將非常感謝。

+0

+1爲你的奮鬥 – virtualeyes 2012-04-26 15:45:21

回答

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中是一樣的。

+0

謝謝。我喜歡你擺脫它的方式。它有點清除頭部。來自PhoneGap的相同照片看起來並不像捲曲那樣激動人心。我的猜測是PhoneGap在幕後進行了一些壓縮,但是,是的,它可能也是編碼。我一直在想,這是我寫字串和回來的,但也許這不是問題。 – Jack 2012-04-26 14:25:56

相關問題