1. 程式人生 > >java-從網路URL中讀取圖片轉換成Base64字串-靠譜版

java-從網路URL中讀取圖片轉換成Base64字串-靠譜版

剛開始開始參考了兩篇文章:
http://blog.csdn.net/simba_cheng/article/details/52295169
http://blog.csdn.net/hfhwfw/article/details/5544408
發現生成的Base64字串轉換為本地圖片有如下問題:

很明顯只能顯示一部分,而且BASE64Encoder報錯,找不到jar包,原因是Base64Encoder並不屬於JDK標準庫範疇,但是又包含在了JDK中,這個問題解決方案如下:

設定Eclipse匯入%JAVA_HOME%\jre\lib目錄下的rt.jar包即可,Project->Properties,選擇Java Build Path設定項,再選擇Libraries標籤,Add External Jars新增%JAVA_HOME%\jre\lib\rt.jar就可以使用啦!

接下來我們們優化將網路圖片編碼為base64的方法:

/** * 將網路圖片編碼為base64 * * @param url * @return * @throws BusinessException */ public static String encodeImageToBase64(URL url) throws Exception { //將圖片檔案轉化為位元組陣列字串,並對其進行Base64編碼處理 System.out.println("圖片的路徑為:" + url.toString()); //開啟連結 HttpURLConnection conn = null; try { conn = (HttpURLConnection) url.openConnection(); //設定請求方式為"GET" conn.setRequestMethod("GET"); //超時響應時間為5秒 conn.setConnectTimeout(5 * 1000); //通過輸入流獲取圖片資料 InputStream inStream = conn.getInputStream(); //得到圖片的二進位制資料,以二進位制封裝得到資料,具有通用性 ByteArrayOutputStream outStream = new ByteArrayOutputStream(); //建立一個Buffer字串 byte[] buffer = new byte[1024]; //每次讀取的字串長度,如果為-1,代表全部讀取完畢 int len = 0; //使用一個輸入流從buffer裡把資料讀取出來 while ((len = inStream.read(buffer)) != -1) { //用輸出流往buffer裡寫入資料,中間引數代表從哪個位置開始讀,len代表讀取的長度 outStream.write(buffer, 0, len); } //關閉輸入流 inStream.close(); byte[] data = outStream.toByteArray(); //對位元組陣列Base64編碼 BASE64Encoder encoder = new BASE64Encoder(); String base64 = encoder.encode(data); System.out.println("網路檔案[{}]編碼成base64字串:[{}]"+url.toString()+base64); return base64;//返回Base64編碼過的位元組陣列字串 } catch (IOException e) { e.printStackTrace(); throw new Exception("圖片上傳失敗,請聯絡客服!"); } }

經測試,OK,沒問題了,完整測試程式碼如下:

package com.test.main;

import sun.misc.BASE64Encoder;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

import com.test.util.Base64Util;
public class Test3 {
/**
* 將網路圖片編碼為base64
*
* @param url
* @return
* @throws BusinessException
*/
public static String encodeImageToBase64(URL url) throws Exception {
//將圖片檔案轉化為位元組陣列字串,並對其進行Base64編碼處理
System.out.println("圖片的路徑為:" + url.toString());
//開啟連結
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) url.openConnection();
//設定請求方式為"GET"
conn.setRequestMethod("GET");
//超時響應時間為5秒
conn.setConnectTimeout(5 * 1000);
//通過輸入流獲取圖片資料
InputStream inStream = conn.getInputStream();
//得到圖片的二進位制資料,以二進位制封裝得到資料,具有通用性
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
//建立一個Buffer字串
byte[] buffer = new byte[1024];
//每次讀取的字串長度,如果為-1,代表全部讀取完畢
int len = 0;
//使用一個輸入流從buffer裡把資料讀取出來
while ((len = inStream.read(buffer)) != -1) {
//用輸出流往buffer裡寫入資料,中間引數代表從哪個位置開始讀,len代表讀取的長度
outStream.write(buffer, 0, len);
}
//關閉輸入流
inStream.close();
byte[] data = outStream.toByteArray();
//對位元組陣列Base64編碼
BASE64Encoder encoder = new BASE64Encoder();
String base64 = encoder.encode(data);
System.out.println("網路檔案[{}]編碼成base64字串:[{}]"+url.toString()+base64);
return base64;//返回Base64編碼過的位元組陣列字串
} catch (IOException e) {
e.printStackTrace();
throw new Exception("圖片上傳失敗,請聯絡客服!");
}
}

public static void main(String[] args) throws Exception {
String imgFilePath="http://d.hiphotos.baidu.com/image/pic/item/a044ad345982b2b713b5ad7d3aadcbef76099b65.jpg";
String base64_str = encodeImageToBase64(new URL(imgFilePath));//將網路圖片編碼為base64
//String base64_str = Base64Util.getImageBinary("D:/test.jpg","jpg");//將本地圖片編碼為base64
System.out.println(base64_str);
Base64Util.base64StringToFile(base64_str,"E:/out.jpg");
}
}

傳送門:

工具類Base64Util.java下載連結:Base64Util.java