likes
comments
collection
share

一个复杂的数据流转换:文件流转base64

作者站长头像
站长
· 阅读数 4

一个复杂的数据流转换:文件流转base64一个复杂的数据流转换:文件流转base64

可是我再也没遇到一个像福贵这样令我难忘的人了,对自己的经历如此清楚,又能如此精彩地讲述自己是如何衰老的。这样的老人在乡间实在是 难以遇上,也许是困苦的生活损坏了他们的记忆,面对往事他们通常显得木讷,常常以不知所措的微笑搪塞过去。——余华《活着》

业务场景

假设有这样一个地址http:127.0.0.1:8080/img/20240305/1.png

这个地址,我们浏览器访问后就会直接下载,但是,我们想要的是一个文件的预览地址,也就是通过这个地址可以直接访问图片,但是无需下载。

原理分析

为什么我们一访问就直接下载了图片呢,是因为图像输入流写入了响应流,一般是这样写的

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ImageServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 指定图像的URL地址
        String imgUrl = "https://example.com/image.jpg";

        // 使用URL类打开指定URL的输入流
        try (InputStream inputStream = new URL(imgUrl).openStream()) {

            // 设置响应的内容类型为图像
            response.setContentType("image/jpeg");

            // 获取响应输出流
            try (OutputStream outputStream = response.getOutputStream()) {

                // 将图像输入流写入响应输出流
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }
            }
        } catch (IOException e) {
            // 处理异常
            e.printStackTrace();
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
    }
}

这是一个简单的Servlet示例,它通过URL获取图像输入流,然后将该流写入HttpServletResponse的输出流。

所以,我们就要思考,既然获取不到图片路径直接进行访问,那我们可不可以直接将响应流获取到,然后转换为文件流,我们避开本地文件存储的环节,然后直接将文件流转换为base64呢?答案是可以的:

代码如下:

imgUrl="http:127.0.0.1:8080/img/20240305/1.png"
// 直接使用URL类获取图像流
InputStream inputStream = new URL(imgUrl).openStream();

先获取到图像流,然后进行数据转换:

private static String convertToBase64(InputStream inputStream) throws IOException {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        byteArrayOutputStream.write(buffer, 0, bytesRead);
    }

    // 使用Base64编码,并手动添加data:image/png;base64,前缀
    String base64Image = "data:image/png;base64," +
            Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());

    return base64Image;
}

结语

最后,至于其他详细的业务逻辑,各位结合其他进行再度分析,这里只是抛砖引玉,供大家参考,感谢大家!