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

结语

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

相关推荐
SL_staff2 分钟前
从‘连得上’到‘管得好’:JVS-IOT双引擎驱动设备运维闭环
java·物联网·产品
IT_陈寒31 分钟前
React的setState真是个演员,你以为它同步其实在装睡
前端·人工智能·后端
ServBay2 小时前
Claude Fable 5.5 测试曝光,但它在悄悄给你打分
后端·ai编程·claude
w_zero_one2 小时前
递归算法(一)
java·开发语言·算法
IT规划师3 小时前
一文讲透五种发布机制:滚动、蓝绿、金丝雀、红黑与 AB
后端·面试
SL_staff3 小时前
私有化低代码不是减配版开发:JVS双模式建模如何重建IT交付信任
java·低代码·spring cloud
墨着染霜华3 小时前
Redocly 生成 OpenAPI 接口文档踩坑实录|Node 版本兼容 + 接口地址错误问题解决
java
文丑颜不良啊3 小时前
LeetCode1881~1990题目解析
java·leetcode
一条Go4 小时前
两套权限目录,三重闸门:Alioth 的多租户 RBAC 为什么这么拧
后端·程序员·github
报表开不开发4 小时前
从"给人看的 Excel"到"能入库的规范行":点检表数据清洗逻辑拆解
程序员