php网站培训机构企业做网站,爱山东app下载注册流程,网站建设a2345,英山县城乡建设规划局网站一个复杂的数据流转换#xff1a;文件流转base64 可是我再也没遇到一个像福贵这样令我难忘的人了#xff0c;对自己的经历如此清楚#xff0c;又能如此精彩地讲述自己是如何衰老的。这样的老人在乡间实在是 难以遇上#xff0c;也许是困苦的生活损坏了他们的记忆#xff0…一个复杂的数据流转换文件流转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呢答案是可以的
代码如下
imgUrlhttp: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;
}结语
最后至于其他详细的业务逻辑各位结合其他进行再度分析这里只是抛砖引玉供大家参考感谢大家