一个复杂的数据流转换:文件流转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;
}

结语

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

相关推荐
2***d885几秒前
Spring Boot中的404错误:原因、影响及处理策略
java·spring boot·后端
c***69301 分钟前
Springboot项目:使用MockMvc测试get和post接口(含单个和多个请求参数场景)
java·spring boot·后端
6***A6632 分钟前
Springboot中SLF4J详解
java·spring boot·后端
五阿哥永琪2 分钟前
Hutool中常用的工具类&真实项目的黄金组合
java
程序员Agions4 分钟前
程序员武学修炼手册(三):融会贯通——从写好代码到架构设计
前端·程序员·强化学习
zhouzhouya5 分钟前
我和TRAE的这一年:从"看不懂"到"玩得转"的AI学习进化史
前端·程序员·trae
xun-ming6 分钟前
Redis实战之7种数据结构
java
tonydf7 分钟前
在Blazor Server中集成docx-preview.js实现高保真Word预览
后端
用户948357016518 分钟前
告别乱七八糟的返回格式:手把手带你封装生产级 Result 实体
后端
W***r269 分钟前
SpringBoot整合easy-es
spring boot·后端·elasticsearch