1. 程式人生 > >Servlet利用base64和json向客戶端傳輸圖片

Servlet利用base64和json向客戶端傳輸圖片

這裡寫圖片描述

更新:這種方法出毛病了!jvm堆溢位了!

原因:byte[] bytes = new byte[fileForInput.available()]這句話在遇到比較大的圖片時,開的記憶體就大,壓根就不能這麼寫!

—————————————————————————————

其實跟上一篇blog差不多,客戶端還是用HttpURLConnection。

伺服器端Servlet在傳輸圖片時,先將圖片編碼為base64格式(也就是一個字串),然後放在JSONObject裡,順帶著其他資料一起傳給客戶端。

客戶端在收到JSONObject後,將base64格式字串取出來,再解碼寫入到一個檔案裡,得到圖片。

OK,下面上程式碼,伺服器端:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        JSONObject json = new JSONObject();
        //圖片路徑
        String picPath = getServletContext().getRealPath("")+"/images/XXX.jpg"
; String content = ProcessClientData.getPicBASE64(picPath); json.put("content",content); json.put("name", "XXX.jpg"); sendJson(json, response); } //base64編碼函式 public String getPicBASE64(String picPath) { String content = ""; try
{ FileInputStream fileForInput = new FileInputStream(picPath); byte[] bytes = new byte[fileForInput.available()]; fileForInput.read(bytes); content = new sun.misc.BASE64Encoder().encode(bytes); fileForInput.close(); } catch (Exception e) { e.printStackTrace(); } return content; } //傳送json函式 public void sendJson(JSONObject json,HttpServletResponse response){ try{ response.setCharacterEncoding("UTF-8"); response.setContentType("application/json;charset=UTF-8"); PrintWriter out = response.getWriter(); out.write(json.toString()); out.flush(); out.close(); }catch(Exception e){ } }

客戶端:

        JSONObject jsonRec = new JSONObject();
        try {
            JSONObject  obj = new JSONObject();
            //要向伺服器發的json
            obj.put("xxx", "XXX");
            // 建立url資源
            URL url = new URL("http://localhost/Test/XXXServlet");
            // 建立http連線
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // 設定允許輸出
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 設定不用快取
            conn.setUseCaches(false);
            // 設定傳遞方式
            conn.setRequestMethod("POST");
            // 設定維持長連線
            conn.setRequestProperty("Connection", "Keep-Alive");
            // 設定檔案字符集:
            conn.setRequestProperty("Charset", "UTF-8");
            // 設定檔案型別:
            conn.setRequestProperty("contentType", "application/json");


            // 開始連線請求
            conn.connect();
            OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
            // 寫入請求的字串
            writer.write(obj.toString());
            writer.flush();
            writer.close();


            //接收伺服器返回的json
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8")) ;
            String line;
            StringBuilder sb = new StringBuilder();
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }     
            br.close();
            conn.disconnect();
            jsonRec = JSONObject.fromObject(sb.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
        //處理json
        String content = jsonRec.getString("content");
        String name = jsonRec.getString("name");

        BASE64Decoder decoder = new BASE64Decoder();  
        try {  
            // Base64解碼  
            byte[] bytes = decoder.decodeBuffer(content);  
            for (int i = 0; i < bytes.length; ++i) {  
                if (bytes[i] < 0) {// 調整異常資料  
                    bytes[i] += 256;  
                }  
            }  
            // 生成圖片  
            OutputStream outs = new FileOutputStream("C:/users/XXX/Desktop/"+name);  
            outs.write(bytes);  
            outs.flush();  
            outs.close();  

        } catch (Exception e) {  
            e.printStackTrace();
        }  

相關推薦

Servlet利用base64json客戶傳輸圖片

更新:這種方法出毛病了!jvm堆溢位了! 原因:byte[] bytes = new byte[fileForInput.available()]這句話在遇到比較大的圖片時,開的記憶體就大,壓根就不能這麼寫! ————————————————————

java客戶圖片

package com.lxxu.content; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import javax.servlet.ServletExcept

servlet客戶返回JSON資料

我們可以使用servlet的內建物件response向客戶端傳送響應。首先我們來看一下官方文件對response的解釋:        定義一個物件來幫助servlet向客戶端傳送響應。servlet容器建立一個ServletResponse物件,並將其作為引數傳遞給ser

WCF伺服器客戶播送訊息心跳檢測

        在利用WCF服務的時候,通常只是在伺服器監聽客戶端呼叫服務。但是WCF服務本就是對TCP, HTTP等各種通訊方式的封裝了所有SOCKET能夠實現的東西,WCF服務應該也能實現。 前面寫過一次部落格,利用WCF服務的會話模式實時檢測客戶端異常掉線。但是對於拔

伺服器客戶返回的常見狀態碼提示資訊

200 OK – [GET]:伺服器成功返回使用者請求的資料,該操作是冪等的(Idempotent)。201 CREATED – [POST/PUT/PATCH]:使用者新建或修改資料成功。202

Java Servlet 客戶返回一個影象的方法(靜態)

 一、伺服器端的靜態圖片。 1.1  基於ImageIO來實現。 public void getMap(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOE

qt 利用執行緒池鎖搭建客戶框架(一)

    做客戶端開發很久了,一直在嘗試搭建一個更好的客戶端架構;在看了qt的QQucikAsyicImageProvider這個類的官方示例後發現,qt的QRunable類在run函式中也可以通過傳送訊號的方式與主執行緒通訊,之前看過的說明都說QRunable不好與主執行緒互

Java伺服器利用JPush 客戶傳送訊息

1首先需要在jpush 官網註冊一個賬號,然後新增我們開發的客戶端程式進行管理,此時會生成Appkey 和Master secret  2 1、匯入 SDK 開發包到你自己的應用程式專案 解壓縮 jpush-sdk_v1.x.y.zip 整合壓縮包複製 libs/jpu

利用Socket實現多客戶傳輸物件傳輸檔案實現

第一次洗部落格,純屬自己紀念,主要來源是慕課網的Socket通訊課程,實現課後任務多客戶端傳輸物件,自己遇到的最大問題是忘記給User類實現序列化介面。客戶端實現:package com.imooc.test; import java.io.BufferedReader;

支持ipV4ipV6的客戶編程

sin 一個 zip eof its urn 連接 初始 動態庫 ipv4和ipv6在socket初始化的時候是不一樣的。 ipv4 socket初始化: int CClient::InitSocket(CString strIP, short portNum)

SCCM 2016 客戶推送Endpoint Protection

雲計算 雲平臺 說道EndPoint Protect大家也許比較陌生,簡單來說,它是微軟提供的一套免費的企業級殺毒軟件。 大家可能在日常的企業中,可能會用到企業級的瑞星,ESET,卡巴斯基,趨勢的OfficeScan等等企業級的管理殺毒軟件,他們方便管理,功能齊全,但是企業級的價格昂貴,且很多軟件是按

zabbix自動發現註冊agent客戶

zabbix自動發現 zabbix 1、創建自動發現規則2、查看是否發現主機3、創建自動發現的動作4、檢查主機有沒有自動添加成功zabbix自動發現和註冊agent客戶端

主動模式被動模式客戶

自定義監控配置 亂碼修改 客戶端服務端有公網IP 客戶端只有內網IP 只能客戶端制定IPTABLES 規則 NAT配置 主機群組模版 預設一些監控項目的集合主機 沒有啟動agent 添加主機 線添加群組創建主機客戶端IP添加完之後應用集 監控項的一個集合 更方便的管理監控項監控項 監控的項 CUP

response客戶輸出的兩種方式

1. response.getOutputStream()  輸出位元組流, 客戶端會下載位元組流並生成檔案儲存本地 response.setHeader("Content-disposition", "attachment;filename= ***.**"); //

Hive讀取HDFS上面的資料使用Squirrel客戶連線Hive

一、把資料從HDFS匯入到hive的表裡 前面已經測試了利用Sqoop把資料從SQL Server匯入到hdfs中,但是分成了好多小檔案,正在思考如何把很多小檔案一起匯入到hive裡面,突然想到可以用*來代替啊。 1.建表 在hive裡面建立好對應的表格  create t

基本的Socket程式設計-基於SwingAWT的客戶

import java.net.ServerSocket; import java.net.Socket; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.IOException; import

基本的Socket編程-基於SwingAWT的客戶

serve event 按鈕 The 分享 實例 換行 而且 list import java.net.ServerSocket; import java.net.Socket; import java.io.InputStreamReader; import java.

2.SDL2_net TCP伺服器多個客戶

上一節初步瞭解到了伺服器和客戶端的通訊,並且由於受到程式碼的限制,只能是單個客戶端,而且伺服器無法向客戶端傳送資訊,本節使用SDL_Net的套接字列表(Socket Set)特性來實現比上一節功能更強的程式碼,即一個伺服器對應多臺客戶端。 一.專案結構CMakeLists.txt的編寫 上一

簡單的java socket TCP程式設計 每隔幾秒伺服器客戶傳時間

客戶端 package javaSocket; import java.io.*; import java.net.*; import org.junit.Test; import jinghai.base.time.LocalDateTime; import jinghai.base.uti

redis安裝及生產採用的啟動方式常用連線客戶

1. 下載 wget命令 wget http://download.redis.io/releases/redis-5.0.2.tar.gz   2. 解壓與安裝 解壓 tar xzf redis-5.0.2.tar.gz   進入目錄