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

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

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

业务场景

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

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

原理分析

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

java 复制代码
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呢?答案是可以的:

代码如下:

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

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

java 复制代码
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;
}

结语

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

相关推荐
一只叫煤球的猫35 分钟前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9651 小时前
tcp/ip 中的多路复用
后端
bobz9651 小时前
tls ingress 简单记录
后端
皮皮林5512 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友2 小时前
什么是OpenSSL
后端·安全·程序员
bobz9653 小时前
mcp 直接操作浏览器
后端
前端小张同学5 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook5 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康6 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在6 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net