【Java】如何根据图片的网络url,下载图片,并base64加密
一、問題
1.1、環境
電腦環境:Windows 10;
開發工具:IntelliJ IDEA;
JDK環境: Jdk1.8;
1.2、問題
我們在開發過程中,會進場要將網絡上的圖片資源,下載下來,經過base64編碼之后,再將編碼后的資源保存下來,或者存儲起來,或者交給下游處理;那么該如何實現呢?
二、解答
著急的朋友可以直接拿源碼,這里我使用了一個base64的編碼附錄如下:
package com.demo.platform.utils;import sun.misc.BASE64Encoder;import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL;public class ImgUtils {public static String tranUrlToBase64String(String url){try {URL urlImg = new URL(url);HttpURLConnection httpURLConnection = (HttpURLConnection) urlImg.openConnection();httpURLConnection.addRequestProperty("User-Agent","Mozilla / 4.76");InputStream is = httpURLConnection.getInputStream();//定義字節數組大小;byte[] buffer = new byte[1024];ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();int rc =0 ;while((rc = is.read(buffer,0,100))>0){byteArrayOutputStream.write(buffer,0,rc);}buffer = byteArrayOutputStream.toByteArray();BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(buffer);} catch (IOException e) {e.printStackTrace();}return null;}public static void main(String[] args) throws Exception {String base64Img = tranUrlToBase64String("http://testvpimg.staplescn.com/cn1100708779EA_1_xnl.jpg\n");System.out.println(base64Img);Base64Utils.GenerateImage(base64Img,"C:\\test\\2.jpg");//測試} }第2個類:
package com.demo.platform.utils;import sun.misc.BASE64Decoder;import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream;public class Base64Utils {/*** base64字符串轉化成圖片** @param imgData 圖片編碼* @param imgFilePath 存放到本地路徑* @return* @throws IOException*/@SuppressWarnings("finally")public static boolean GenerateImage(String imgData, String imgFilePath) throws IOException { // 對字節數組字符串進行Base64解碼并生成圖片if (imgData == null) // 圖像數據為空return false;BASE64Decoder decoder = new BASE64Decoder();OutputStream out = null;try {out = new FileOutputStream(imgFilePath);// Base64解碼byte[] b = decoder.decodeBuffer(imgData.replace("data:image/jpeg;base64,", ""));for (int i = 0; i < b.length; ++i) {if (b[i] < 0) {// 調整異常數據b[i] += 256;}}out.write(b);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {out.flush();out.close();return true;}} }如果不著急的小伙伴可以看下線面的講解
1、使用JDK自帶的URL連接方式,進行URL連接;入參為url地址;
2、使用HttpURLConnection 實體類進行url連接;這里,使用JDK中URL自帶的openConnection方法進行連接操作;
3、連接后,將連接后返回的數據以InputStream輸入流的形式寫入到電腦內存;就相當于別人告訴你水庫的地址,你自己用一個水管將水庫里的水,通過這個水管Stream,將水流導入到自己的池塘里;這里我們得注意,跟實際生活經驗一個道理,你自己的池塘要能容納的了這么多容量的水,或者及時引入,及時排除;不然內存就會被占滿;
4、現在,圖片以數據流的形式存儲在我們內存,一旦我們電腦突然斷電,我們的數據就會丟失的;所以,我們要以持久化的形式保存下來,所謂持久化,通俗的理解就是以相對穩定的保存方式來保存數據,例如以各種文件的形式保存在硬盤,U盤等;這次電腦關機后,下次我還能訪問;
5、我們要將內存中的數據讀出來,并且進行base64編碼,什么叫base64編碼,請看這里【base64編碼】
6、關于流的操作:我們這里用【字節數組】容器來讀取(類似用桶舀水),每次讀取,以【字節】的形式讀取【輸入流】(類比以ml,克,千克,L等單位分度來舀水,你可以理解為有容量刻度的量筒),每次讀取100個字節,然后通過【字節數組輸出流】些出到byte數組里(可以理解為一個桶),因為桶的容量是1024,我每次放一部分水流進來(100字節),所以,只要不超過水管的容量,就不會異常;之后,我通過 byteArrayOutputStream 這個管道,將這個桶里的水一桶一桶倒入,水進入這個管道,在輸出流管道的盡頭要用容器來接水,這里我們還是用之前的byte數組容器來裝數據,也可以自己新建一個數組容器來裝,但是考慮到容器的復用性,這里直接用原來的桶來裝(不要問我為什么上游書庫舀水的桶可以在下游的水池里再用,我們這塊邏輯跟現實有點不一樣,沒有物理距離一說,上面只是打個比喻);之后就是用BASE64Encoder將這個桶里的數據進行編碼;
7、用一個1024大小的byte數組來裝管道里所有的數據,為啥能裝得下?因為TCP/IP 協議是以包的形式來傳輸數據,不是說這個圖片有5M,這里一股腦都給你把5M的數據都傳輸給你,而是以包的形式,將數據分批次給你;這里可以理解為用箱子裝貨物,然后順著河流往下漂流;而每個箱子的大小,最1024也夠用了;為什么要有箱子呢?你全校師生去旅游,不可能全校的人都瞬移到目的地,而是通過坐車或者其他方式,以一定的單位進行傳輸和移動的;如果是坐車,這個車就可以理解為包的概念;
8、第2個類中,有這么一行代碼:
byte[] b = decoder.decodeBuffer(imgData.replace("data:image/jpeg;base64,", ""));這里是因為,base64編碼的圖片文件,會帶有base64的圖片頭代碼,解碼的時候,要去掉,不然無法顯示;
完畢~
三、總結
歡迎關注我的
CSDN博客: https://blog.csdn.net/River_Continent
微信公眾號:幕橋社區
知乎:張牧野, https://www.zhihu.com/people/zhang-mu-ye-37-76/activities
簡書: https://www.jianshu.com/u/02c0096cbfd3
總結
以上是生活随笔為你收集整理的【Java】如何根据图片的网络url,下载图片,并base64加密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 标定系列二、9点标定以及5点圆心标定过程
- 下一篇: Climbing Stairs -- L