码上焚香

Yahocen

Java 将图片转成 Base64 编码字符串(网络+本地)

8
2024-05-10

在工作中,经常需要将图片转换成Base64编码。我曾尝试从网上复制代码,但发现保存的图片不完整。因此,我决定自己动手丰衣足食,对代码进行了二次加工,现在记录下来分享给大家。

流程分析

  1. 从网络或本地加载图片到内存

  2. 将内存中的图片转成Base64

PS:大多数情况下,图片显示不完整是由于网络传输过程中的分包传输,导致并非一次性将整个图片传输完成。如果仅获取了部分数据,就会导致图片显示不完整。

工具模块

使用 Apache Commons Codec 的 Base64 模块可以替换成其他模块,但需要注意的是,不同的 Base64 模块可能遵循不同的规范,导致转换后的结果可能会带有换行符。

流程简单,不再赘述,直接展示代码:

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.commons.codec.binary.Base64;

public class ImageUtils {

    // 将本地图片转成Base64
    public static String toBase64(String imgpath) {
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(imgpath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return toBase64(inputStream);
    }

    // 通过网络URL将图片转成Base64
    public static String toBase64(URL url) {
        // 打开链接
        HttpURLConnection conn;
        InputStream inStream = null;
        try {
            conn = (HttpURLConnection) url.openConnection();
            // 设置请求方式为"GET"
            conn.setRequestMethod("GET");
            // 超时响应时间为5秒
            conn.setConnectTimeout(5 * 1000);
            // 通过输入流获取图片数据
            inStream = conn.getInputStream();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 生成base64
        return toBase64(inStream);
    }
}