搜尋

首頁  >  問答  >  主體

java圖片轉base64和真實的結果不一樣

先上代碼

        String imgURL = "http://www.g3zj.net:8082/util.action?method=appauthimg&d_=99";

        byte[] data = null;
        try {
            // 创建URL
            URL url = new URL(imgURL);
            // 创建链接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5 * 1000);
            InputStream inStream = conn.getInputStream();
            data = new byte[inStream.available()];
            inStream.read(data);
            inStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        str=encoder.encode(data);

就是從一個網絡讀取圖片並轉成base64.發現轉出來的結果無法用於img標簽顯示(已加了data:image/jpeg;base64,前綴)。
後來直接百度找了一個在線生成base64的網站,把這個圖片url放上去轉換,
結果發現別人在線轉換出來的base64比我java代碼轉換的base64還長了很多。

為什麼會這樣呢?

迷茫迷茫2847 天前873

全部回覆(3)我來回復

  • 黄舟

    黄舟2017-04-18 10:58:39

    InputStream 的 available() 傳回的值是該InputStream 在不被阻塞的情況下,一次可以讀取到的資料長度。但網路情況總是不定的,常常阻塞。所以建議使用循環讀取 InputStream 中的資料。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:58:39

    讀取整個InputStream时,用Streams.copy()比穩,例如題主這個例子中,可以是:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    Streams.copy(conn.getInputStream(), baos);
    String str = new BASE64Encoder(baos.toByteArray());

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:58:39

     String imgURL = "http://www.g3zj.net:8082/util.action?method=appauthimg&d_=99";
            ByteArrayOutputStream data = new ByteArrayOutputStream();
            try {
                // 创建URL
                URL url = new URL(imgURL);
                byte[] by = new byte[1024];
                // 创建链接
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setConnectTimeout(5 * 1000);
                InputStream is = conn.getInputStream();
                // 将内容读取内存中
                int len = -1;
                while ((len = is.read(by)) != -1) {
                    data.write(by, 0, len);
                }
                // 关闭流
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 对字节数组Base64编码
            BASE64Encoder encoder = new BASE64Encoder();
            System.out.println("data:image/jpg;base64,"+encoder.encode(data.toByteArray()));

    然而樓主的程式碼是可以用的,在我這裡,只要加上data:image/jpg;base64,就好了

    回覆
    0
  • 取消回覆