一个复杂的数据流转换:文件流转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;
}
结语
最后,至于其他详细的业务逻辑,各位结合其他进行再度分析,这里只是抛砖引玉,供大家参考,感谢大家!