2013-08-04 37 views
1

我想使用的WebClient現有的實例來下載圖像。原因是因爲我想讓cookie與請求一起傳遞。使用的HtmlUnit來的WebClient下載的圖像以Base64編碼數據烏里

如何使用WebClient現有比如我下載的圖像?

另外,我怎麼能Base64編碼,圖像可以通過查看它data:image/jpeg;base64,...

當前代碼:

WebClient client = new WebClient(BrowserVersion.FIREFOX_3_6); 
UnexpectedPage imagePage = client.getPage("http://..."); 
String imageString = imagePage.getWebResponse().getContentAsString(); 
BASE64Encoder encoder = new BASE64Encoder(); 
String base64data = encoder.encode(imageString.getBytes()); 

所以現在我有形象的base64數據,但我仍然可以」 t使用data:image/jpeg;base64,...查看圖像。

+0

你現在怎麼樣?我的意思是,如何構建現有的實例'WebClient'(您正在使用的代碼)? – acdcjunior

+0

只是假設基本的'WebClient客戶端=新的WebClient(BrowserVersion.FIREFOX_3_6);' – user2103849

+0

你有圖像作爲字符串,你想它作爲文件? – acdcjunior

回答

1

一對夫婦的事情要考慮:

  • BASE64Encoder()生成具有換行符每77個字符的字符串。用.replaceAll("\r?\n","")取出。
  • 對於這種方法還,不如檢索網頁InputStream而不是字符串。此外,爲了將其轉換爲byte陣列,我使用了一種實用方法(源和其他選項可以找到here)。

工作源代碼:

public static void main (String args[]) throws IOException { 
    WebClient client = new WebClient(BrowserVersion.FIREFOX_3_6); 
    UnexpectedPage imagePage = client.getPage("http://i.stack.imgur.com/9DdHc.jpg"); 
    BASE64Encoder encoder = new BASE64Encoder(); 
    String base64data = encoder.encode(inputStreamToByteArray(imagePage.getWebResponse().getContentAsStream())); 
    System.out.println("<img src=\"data:image/png;base64,"+base64data.replaceAll("\r?\n","")+"\" />"); 
} 

private static byte[] inputStreamToByteArray(InputStream is) throws IOException { 
    ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
    int nRead; 
    byte[] data = new byte[16384]; 
    while ((nRead = is.read(data, 0, data.length)) != -1) { 
     buffer.write(data, 0, nRead); 
    } 
    buffer.flush(); 
    return buffer.toByteArray(); 
} 

源圖像:

yao face

輸出的base64圖像here

+0

'imagePage.getWebResponse()。getContentAsString()'不工作,因爲它試圖編碼接收到的內容爲'String',並且爲此它變成'?'它不能編碼的字節。即使使用'getContentAsString(「base64」)'改變一個字節在這裏和那裏,女巫可以完全混亂的形象:http://jsfiddle.net/acdcjunior/JeayD/2/ – acdcjunior

+0

是的,我想通了。我使用了'image.getWebResponse()。getContentAsStream()',它工作 – user2103849