在做接口測試的時候,某些接口返回的content是一大段加密文字。這種情況下,有可能是返回的圖片加密數據,需要將這些數據轉換成圖片進行保存查看。
例如:
這里,可以看到Content對應的鍵值開頭有“data:image/jpeg;base64,”的字樣。我們可以簡單的認為,這是個jpeg格式的圖片,而且經過base64的編碼。
通過JPath,我們可以直接取到Content的返回內容,然后去掉前面的“data:image/jpeg;base64,”就是實際的返回數據。
//取得返回json中的Content數據
String content = JSONPath.read(json, "$.Content").toString());
//去掉前面的“data:image/jpeg;base64,”的字樣 String imgdata = content.replace("data:image/jpeg;base64,","") //解碼base64 BASE64Decoder decoder = new BASE64Decoder(); byte[] data = decoder.decodeBuffer(imgdata); for(int i =0 ; i < data.length ;i++) { if(data[i] < 0) { data[i] += 256; } }
//寫入保存成jpeg文件 FileOutputStream fos = new FileOutputStream ("D:\\test.jpg"); fos.write(data); fos.flush(); fos.close();
當然,有解碼也會有加編碼。如果我們想把一個圖片文檔加編碼成base64,可以參考以下代碼:
public static String getImageStr(String imgFile) { InputStream inputStream = null; byte[] data = null; try { inputStream = new FileInputStream(imgFile); data = new byte[inputStream.available()]; inputStream.read(data); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } // 加編碼 BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data); }
這樣即可將圖片轉換成base64編碼的字符串。
如果直接使用上面的代碼,應該是不能成功的。原因在於,Base64的加密解密都是使用sun.misc包下的BASE64Encoder及BASE64Decoder的sun.misc.BASE64Encoder/BASE64Decoder類。
這個類是sun公司的內部方法,並沒有在java api中公開過,不屬於JDK標准庫范疇,但在JDK中包含了該類,可以直接使用。但是在Eclipse中直接使用,卻找不到該類。解決方法如下:
1.右鍵項目--》Build Path --》Configure Build Path
選擇Libraries,點擊JRE System Library,選擇 Access rules,如果之前沒有定義規則,會顯示No rules defined
2. Access rules,點擊Edit --》Add,然后點擊Ok
3.在Resolution下拉列表框中選擇Accessible,Rule Pattern 選擇**,依次點擊ok
經過這樣的操作了之后,我們就可以順利的使用Base64相關的類了。