使用Java實(shí)現(xiàn)文件流轉(zhuǎn)base64
業(yè)務(wù)場(chǎng)景
假設(shè)有這樣一個(gè)地址:http:127.0.0.1:8080/img/20240305/1.png
這個(gè)地址,我們?yōu)g覽器訪問(wèn)后就會(huì)直接下載,但是,我們想要的是一個(gè)文件的預(yù)覽地址,也就是通過(guò)這個(gè)地址可以直接訪問(wèn)圖片,但是無(wú)需下載。
原理分析
為什么我們一訪問(wèn)就直接下載了圖片呢,是因?yàn)閳D像輸入流寫(xiě)入了響應(yīng)流,一般是這樣寫(xiě)的
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類(lèi)打開(kāi)指定URL的輸入流 try (InputStream inputStream = new URL(imgUrl).openStream()) { // 設(shè)置響應(yīng)的內(nèi)容類(lèi)型為圖像 response.setContentType("image/jpeg"); // 獲取響應(yīng)輸出流 try (OutputStream outputStream = response.getOutputStream()) { // 將圖像輸入流寫(xiě)入響應(yīng)輸出流 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); } } }
這是一個(gè)簡(jiǎn)單的Servlet示例,它通過(guò)URL
獲取圖像輸入流,然后將該流寫(xiě)入HttpServletResponse
的輸出流。
所以,我們就要思考,既然獲取不到圖片路徑直接進(jìn)行訪問(wèn),那我們可不可以直接將響應(yīng)流獲取到,然后轉(zhuǎn)換為文件流,我們避開(kāi)本地文件存儲(chǔ)的環(huán)節(jié),然后直接將文件流轉(zhuǎn)換為base64呢?答案是可以的:
代碼如下:
imgUrl="http:127.0.0.1:8080/img/20240305/1.png" // 直接使用URL類(lèi)獲取圖像流 InputStream inputStream = new URL(imgUrl).openStream();
先獲取到圖像流,然后進(jìn)行數(shù)據(jù)轉(zhuǎn)換:
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編碼,并手動(dòng)添加data:image/png;base64,前綴 String base64Image = "data:image/png;base64," + Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray()); return base64Image; }
結(jié)語(yǔ)
最后,至于其他詳細(xì)的業(yè)務(wù)邏輯,各位結(jié)合其他進(jìn)行再度分析,這里只是拋磚引玉.
到此這篇關(guān)于使用Java實(shí)現(xiàn)文件流轉(zhuǎn)base64的文章就介紹到這了,更多相關(guān)Java文件流轉(zhuǎn)base64內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java分布式緩存系統(tǒng)中必須解決的四大問(wèn)題
分布式緩存系統(tǒng)是三高架構(gòu)中不可或缺的部分,極大地提高了整個(gè)項(xiàng)目的并發(fā)量、響應(yīng)速度,但它也帶來(lái)了新的需要解決的問(wèn)題,分別是: 緩存穿透、緩存擊穿、緩存雪崩和緩存一致性問(wèn)題。本文將詳細(xì)講解一下這四大問(wèn)題,需要的可以參考一下2022-04-04Spring5.2.x 源碼本地環(huán)境搭建的方法步驟
這篇文章主要介紹了Spring5.2.x 源碼本地環(huán)境搭建的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Java多態(tài)實(shí)現(xiàn)原理詳細(xì)梳理總結(jié)
這篇文章主要介紹了Java多態(tài)實(shí)現(xiàn)原理詳細(xì)梳理總結(jié),多態(tài)是繼封裝、繼承之后,面向?qū)ο蟮牡谌筇匦?,本文只總結(jié)了多態(tài)的實(shí)現(xiàn)原理,需要的朋友可以參考一下2022-06-06詳解如何Java中實(shí)現(xiàn)Excel的注釋和批注
注釋及批注是?Excel?中比較常用的功能,這篇文章主要為大家詳細(xì)介紹了如何在Java中實(shí)現(xiàn)Excel的注釋和批注,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12MyBatis查詢數(shù)據(jù)庫(kù)語(yǔ)句總結(jié)
MyBatis是一種持久化框架,可以與許多不同類(lèi)型的關(guān)系型數(shù)據(jù)庫(kù)連接,下面這篇文章主要給大家介紹了關(guān)于MyBatis查詢數(shù)據(jù)庫(kù)語(yǔ)句的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06Java String字符串補(bǔ)0或空格的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java String字符串補(bǔ)0或空格的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-09-09Java實(shí)戰(zhàn)之火車(chē)票預(yù)訂系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了利用Java實(shí)現(xiàn)的火車(chē)票預(yù)訂系統(tǒng),文中用到了JSP?、Servlert、JQuery、Ajax?等技術(shù),文中示例代碼講解詳細(xì),需要的可以參考一下2022-02-02SpringBoot服務(wù)開(kāi)啟后通過(guò)端口訪問(wèn)無(wú)反應(yīng)的解決
這篇文章主要介紹了SpringBoot服務(wù)開(kāi)啟后通過(guò)端口訪問(wèn)無(wú)反應(yīng)的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10