【Java】如何根据图片的网络url,下载图片,并base64加密
一、問(wèn)題
1.1、環(huán)境
電腦環(huán)境:Windows 10;
開(kāi)發(fā)工具:IntelliJ IDEA;
JDK環(huán)境: Jdk1.8;
1.2、問(wèn)題
我們?cè)陂_(kāi)發(fā)過(guò)程中,會(huì)進(jìn)場(chǎng)要將網(wǎng)絡(luò)上的圖片資源,下載下來(lái),經(jīng)過(guò)base64編碼之后,再將編碼后的資源保存下來(lái),或者存儲(chǔ)起來(lái),或者交給下游處理;那么該如何實(shí)現(xiàn)呢?
二、解答
著急的朋友可以直接拿源碼,這里我使用了一個(gè)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();//定義字節(jié)數(shù)組大小;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");//測(cè)試} }第2個(gè)類:
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字符串轉(zhuǎn)化成圖片** @param imgData 圖片編碼* @param imgFilePath 存放到本地路徑* @return* @throws IOException*/@SuppressWarnings("finally")public static boolean GenerateImage(String imgData, String imgFilePath) throws IOException { // 對(duì)字節(jié)數(shù)組字符串進(jìn)行Base64解碼并生成圖片if (imgData == null) // 圖像數(shù)據(jù)為空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) {// 調(diào)整異常數(shù)據(jù)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連接方式,進(jìn)行URL連接;入?yún)閡rl地址;
2、使用HttpURLConnection 實(shí)體類進(jìn)行url連接;這里,使用JDK中URL自帶的openConnection方法進(jìn)行連接操作;
3、連接后,將連接后返回的數(shù)據(jù)以InputStream輸入流的形式寫(xiě)入到電腦內(nèi)存;就相當(dāng)于別人告訴你水庫(kù)的地址,你自己用一個(gè)水管將水庫(kù)里的水,通過(guò)這個(gè)水管Stream,將水流導(dǎo)入到自己的池塘里;這里我們得注意,跟實(shí)際生活經(jīng)驗(yàn)一個(gè)道理,你自己的池塘要能容納的了這么多容量的水,或者及時(shí)引入,及時(shí)排除;不然內(nèi)存就會(huì)被占滿;
4、現(xiàn)在,圖片以數(shù)據(jù)流的形式存儲(chǔ)在我們內(nèi)存,一旦我們電腦突然斷電,我們的數(shù)據(jù)就會(huì)丟失的;所以,我們要以持久化的形式保存下來(lái),所謂持久化,通俗的理解就是以相對(duì)穩(wěn)定的保存方式來(lái)保存數(shù)據(jù),例如以各種文件的形式保存在硬盤(pán),U盤(pán)等;這次電腦關(guān)機(jī)后,下次我還能訪問(wèn);
5、我們要將內(nèi)存中的數(shù)據(jù)讀出來(lái),并且進(jìn)行base64編碼,什么叫base64編碼,請(qǐng)看這里【base64編碼】
6、關(guān)于流的操作:我們這里用【字節(jié)數(shù)組】容器來(lái)讀取(類似用桶舀水),每次讀取,以【字節(jié)】的形式讀取【輸入流】(類比以ml,克,千克,L等單位分度來(lái)舀水,你可以理解為有容量刻度的量筒),每次讀取100個(gè)字節(jié),然后通過(guò)【字節(jié)數(shù)組輸出流】些出到byte數(shù)組里(可以理解為一個(gè)桶),因?yàn)橥暗娜萘渴?024,我每次放一部分水流進(jìn)來(lái)(100字節(jié)),所以,只要不超過(guò)水管的容量,就不會(huì)異常;之后,我通過(guò) byteArrayOutputStream 這個(gè)管道,將這個(gè)桶里的水一桶一桶倒入,水進(jìn)入這個(gè)管道,在輸出流管道的盡頭要用容器來(lái)接水,這里我們還是用之前的byte數(shù)組容器來(lái)裝數(shù)據(jù),也可以自己新建一個(gè)數(shù)組容器來(lái)裝,但是考慮到容器的復(fù)用性,這里直接用原來(lái)的桶來(lái)裝(不要問(wèn)我為什么上游書(shū)庫(kù)舀水的桶可以在下游的水池里再用,我們這塊邏輯跟現(xiàn)實(shí)有點(diǎn)不一樣,沒(méi)有物理距離一說(shuō),上面只是打個(gè)比喻);之后就是用BASE64Encoder將這個(gè)桶里的數(shù)據(jù)進(jìn)行編碼;
7、用一個(gè)1024大小的byte數(shù)組來(lái)裝管道里所有的數(shù)據(jù),為啥能裝得下?因?yàn)門(mén)CP/IP 協(xié)議是以包的形式來(lái)傳輸數(shù)據(jù),不是說(shuō)這個(gè)圖片有5M,這里一股腦都給你把5M的數(shù)據(jù)都傳輸給你,而是以包的形式,將數(shù)據(jù)分批次給你;這里可以理解為用箱子裝貨物,然后順著河流往下漂流;而每個(gè)箱子的大小,最1024也夠用了;為什么要有箱子呢?你全校師生去旅游,不可能全校的人都瞬移到目的地,而是通過(guò)坐車(chē)或者其他方式,以一定的單位進(jìn)行傳輸和移動(dòng)的;如果是坐車(chē),這個(gè)車(chē)就可以理解為包的概念;
8、第2個(gè)類中,有這么一行代碼:
byte[] b = decoder.decodeBuffer(imgData.replace("data:image/jpeg;base64,", ""));這里是因?yàn)?#xff0c;base64編碼的圖片文件,會(huì)帶有base64的圖片頭代碼,解碼的時(shí)候,要去掉,不然無(wú)法顯示;
完畢~
三、總結(jié)
歡迎關(guān)注我的
CSDN博客: https://blog.csdn.net/River_Continent
微信公眾號(hào):幕橋社區(qū)
知乎:張牧野, https://www.zhihu.com/people/zhang-mu-ye-37-76/activities
簡(jiǎn)書(shū): https://www.jianshu.com/u/02c0096cbfd3
總結(jié)
以上是生活随笔為你收集整理的【Java】如何根据图片的网络url,下载图片,并base64加密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 标定系列二、9点标定以及5点圆心标定过程
- 下一篇: 7-132 画菱形 (10 分) 菱形是