java中關於json傳圖片的方法


摘錄自:http://www.cnblogs.com/lilh/p/5352499.html

 

 一般來說傳圖片可以以流的形式來傳輸,即便是用json傳輸,一般也都是傳一個地址,而圖片都存在服務器上,然后順着地址發送請求下載圖片。

  但是這次公司的項目中,圖片是存在oracle數據庫中的blob字段的,並沒有存在服務器上,也就是說我必須傳圖片本身過去,而json是無法傳輸二進制的文本格式,因此我就想將圖片轉為字符串形式傳輸,然后對方再解碼然后轉換回來就行了。

  我的方法分三個步驟:

    1.將圖片轉為字節數組

    2.將字節數組轉為字符串

    3.壓縮字符串,放入json傳輸

  首先是第一步,將圖片轉為字節數組,代碼如下:

復制代碼
 1 /**
 2 * 將圖片轉換為字節數組
 3 * @return
 4 */
 5 private byte[] loadImage(File file){
 6     //用於返回的字節數組
 7     byte[] data=null;
 8     //打開文件輸入流
 9     FileInputStream fin=null;
10     //打開字節輸出流
11     ByteArrayOutputStream bout=null;
12     try{
13         //文件輸入流獲取對應文件
14         fin=new FileInputStream(file);
15         //輸出流定義緩沖區大小
16         bout=new ByteArrayOutputStream((int)file.length);
17         //定義字節數組,用於讀取文件流
18         byte[] buffer=new byte[1024];
19         //用於表示讀取的位置
20         int len=-1;
21         //開始讀取文件
22         while((len=fin.read(buffer))!=-1){
23             //從buffer的第0位置開始,讀取至第len位置,結果寫入bout
24             bout.write(buffer,0,len);
25         }
26         //將輸出流轉為字節數組
27         data=bout.toByteArray();
28         //關閉輸入輸出流
29         fin.close();
30         bout.close();
31     }catch(Exception e){
32         e.printStackTrace();
33     }
34     return data;
35 }
復制代碼

  然后是第二步,將字節數組轉為字符串

復制代碼
 1 /**
 2 * 把字節數組轉化為字符串----"ISO-8859-1"
 3 * @param date
 4 * @return
 5 */
 6 private String byteToString(byte[] data){
 7     String dataString=null;
 8     try{
 9         //將字節數組轉為字符串,編碼格式為ISO-8859-1
10         dataString=new String(data,"ISO-8859-1");
11     }catch(Exception e){
12         e.printStackTrace();
13     }
14     return dataString;
15 }
復制代碼

  接下來就是最后一步,將字符串壓縮后返回

復制代碼
 1 /**
 2 * 壓縮字符串----"ISO-8859-1"
 3 * @param data
 4 * @return
 5 */
 6 private String compress(String data){
 7     String finalData=null;
 8     try{
 9         //打開字節輸出流
10         ByteArrayOutputStream bout=new ByteArrayOutputStream();
11         //打開壓縮用的輸出流,壓縮后的結果放在bout中
12         GZIPOutpuStream gout=new GZIPOutputStream(bout);
13         //寫入待壓縮的字節數組
14         gout.write(data.getBytes("ISO-8859-1"));
15         //完成壓縮寫入
16         gout.finish();
17         //關閉輸出流
18         gout.close();
19         finalData=bout.toString("ISO-8859-1");
20     }catch(Exception e){
21         e.printStackTrace();
22     }
23     return finalData;
24 }
復制代碼

  以上就是我所用的方法,有些不熟悉的地方習慣於一句話一個注釋算是我的習慣吧,可能會讓人看起來比較亂,請不要介意,而且有些注釋都是我自己猜測的,並不一定准確,如果錯了還請指出來,謝謝了!

  然后說下我當時寫這方法的一些瑣碎的事情吧,當時一開始我確實是想着轉字符串傳輸,但是畢竟沒寫過,因此也在網上查閱過,百度上很多都說轉Base64格式字符串傳輸,我試了很多遍,然而可能是我哪里寫的不對,導致一直沒有成功,我的測試方法是從數據庫中取出那個blob字段的數據,然后經過轉化壓縮,然后在本地生成一個圖片,但是最終我發現那個圖片都是打不開的,提示文件錯誤或損壞,並且圖片大小也有點怪異,估計是我哪里代碼寫的不對吧。

  然后我就干脆不轉Base64了,但是不設置編碼格式肯定是不行的,后來又在aawwmate的博客中看到了一個轉載的文章,也是關於json傳輸圖片的,看完后我就按照那篇文章中說的用ISO-8859-1格式來傳輸,確實就成功了,在此萬分感謝。

  相信大家在代碼中也看見了那個壓縮字符串的時候,實際上是將字符串轉為字節數組壓縮完后又轉為字符串的吧,為什么要多此一舉,不直接將字節數組壓縮后再轉為字符串呢,這方面其實我自己也想過,但是我試了還是老樣子,就是本地生成的圖片打不開,以后有時間再去試試能不能改改看。

  關於壓縮的話我當時測試了下,實際上是對於小圖片是會導致圖片變大的,當時好像測試的是一個3k的原圖片,經過上面三個步驟以后,在本地解碼解壓轉換生成的圖片卻是5k的,但是我又試了一個17k的圖片,最終生成的圖片是10k的,也就是說壓縮還是可取的。

  最后,我想說上述代碼是手打的。。。。。。不是直接在經過測試的代碼中復制粘貼的,可能會有細微的字母錯誤- -。請見諒。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM