java中關於json傳圖片的方法,javajson傳圖片

來源:互聯網
上載者:User

java中關於json傳圖片的方法,javajson傳圖片

  一般來說傳圖片可以以流的形式來傳輸,即便是用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位置,結果寫入bout24             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-110         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的,也就是說壓縮還是可取的。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.