java轉發二進制圖片流【原】


 

WxQrCoodTool 

java請求目標系統返回二進制圖片的接口,並返回給請求方二進行圖片流

前端-->java后台(相當於中轉)-->圖片服務器后端

    /**
     * 獲取小程序二維碼,如果調用成功,會直接返回圖片二進制內容,如果請求失敗,會返回 JSON 格式的數據,根據此解釋,應該直接由前端生成,不用繞后台
     * @return
     */
    @RequestMapping(value = {"/getWxACodeUnlimit"}, method = {RequestMethod.POST, RequestMethod.GET})
    @ResponseBody
    @Override
    public void getWxACodeUnlimit(HttpServletRequest request,HttpServletResponse response, @RequestBody String requestBody ,@RequestParam String accessToken) {
       
        String address = String.join("", configProperty.getUnlimitMiniAppCode(), accessToken);
        try {
            logger.info("獲取小程序二維碼接口-請求報文:{}",requestBody);
            byte[] resultArray = WxQrCoodTool.sendRequestData(address, requestBody, "utf-8","utf-8",5000, 5000);
            WxQrCoodTool.returnImage(resultArray,response);//返回二進制圖片流
           
        } catch (Exception e) {
           
        }
    }

 

 

package com.rosellete.iescp.cshop.tool.http;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;

/**
 * http post發送工具,用於接收二進行文件流
 * 該工具類一次性使用,不建議復用,專門針對微信post請求返回圖片二進制流的功能進行了定制化處理,如果異常微信還可能會返回json串
 * @author King
 */
public class WxQrCoodTool {
    private static final String DEFAULT_CHARSET = "utf-8";

    public static void main(String[] args) throws Exception {
        String requestUrl = "http://i.ce.cn/ce/img4/jrwx.jpg";
        byte[] resultsArray = WxQrCoodTool.sendRequestData(requestUrl,"requestData",  "GBK", "GBK", 3000, 3000);//大家最終只要使用這一句代碼就可調用
        WxQrCoodTool.writeImageToFile(resultsArray,"C:\\Users\\King\\Desktop\\iescp-cshopadmin-activity-boot\\aaaaaa123456789.png");
    }

    /**
     * 發送報文
     *
     * @param appName           應用系統英文名
     * @param requestData       請求報文
     * @param urlStr            請求地址
     * @param connectionTimeout 鏈接超時時間  1000代表 1秒
     * @param readTimeout       讀取超時時間 1000代表1秒
     * @return
     * @throws IOException
     * @author King
     */
    public static byte[] sendRequestData(String urlStr, String requestData, String sendEncoding, String recvEncoding, int connectionTimeout, int readTimeout) throws IOException {
        InputStream inputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        byte[] buff = new byte[1024];
        int len = 0;

        URL url = null;
        HttpURLConnection conn = null;
        ByteArrayOutputStream byteOut = null;
        BufferedReader readInfo = null;
        StringBuffer strBuilder = new StringBuffer();
        OutputStream outputStream = null;
        try {
            System.out.println("請求時間:【" + new Date() + "】");
            System.out.println("請求地址:【" + urlStr + "】");
            System.out.println("請求報文:【" + requestData + "】");
            url = new URL(urlStr);
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            //conn.setRequestProperty("SOAPAction", "\"\"");
            //conn.setRequestProperty("Accept", "application/soap+xml, application/dime, multipart/related, text/*");
            //如果沒有下面這一行代碼,服務器端可以通過request.getParameter()和request.getInputStream()都接收到相同信息
            //conn.setRequestProperty("content-type", "text/xml;charset=GBK");
            //如果    有上面這一行代碼,服務器端僅能通過request.getInputStream()接收信息
            //conn.setRequestProperty("User-Agent", "Axis/1.4");
            conn.setRequestProperty("Cache-Control", "no-cache");
            conn.setUseCaches(false); //忽略緩存
            conn.setDoOutput(true); //使用 URL 連接進行輸出
            conn.setDoInput(true); //使用 URL 連接進行輸入
            conn.setConnectTimeout(connectionTimeout);//鏈接超時
            conn.setReadTimeout(readTimeout);//讀取超時
            conn.connect();//建立鏈接
            byteOut = new ByteArrayOutputStream();
            byteOut.write(requestData.getBytes(sendEncoding));//以指定編碼發送,如果有亂碼,修改之
            byte[] buf = byteOut.toByteArray();
            outputStream = conn.getOutputStream();
            outputStream.write(buf);
            outputStream.flush();
            inputStream = conn.getInputStream();
            byteArrayOutputStream = new ByteArrayOutputStream();
            while ((len = inputStream.read(buff)) != -1) {
                byteArrayOutputStream.write(buff, 0, len);
            }
            return byteArrayOutputStream.toByteArray();
            //if (HttpURLConnection.HTTP_OK == conn.getResponseCode()) {//正確返回
            //    readInfo = new BufferedReader(new java.io.InputStreamReader(conn.getInputStream(),recvEncoding));//以指定編碼讀取返回信息,如果有亂碼,修改之
            //    String line = null;
            //    while ((line = readInfo.readLine()) != null) {
            //        strBuilder.append(line);
            //    }
            //} else {//沒有正確返回
            //    readInfo = new BufferedReader(new java.io.InputStreamReader(conn.getInputStream(),recvEncoding));//以指定編碼讀取返回信息,如果有亂碼,修改之
            //    System.out.println("出現異常,返回報文:【"+readInfo+"】");
            //    throw new IOException("url請求出現問題,返回編碼:" + conn.getResponseCode());
            //}
            //System.out.println("返回時間:【"+new Date()+"】");
            //System.out.println("返回報文:【"+strBuilder.toString()+"】");
        } catch (UnsupportedEncodingException e) {
            throw e;
        } catch (MalformedURLException e) {
            throw e;
        } catch (IOException e) {
            throw e;
        } finally {
            try {
                if (readInfo != null) {
                    readInfo.close();
                }
                if (byteOut != null) {
                    byteOut.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
                if (byteArrayOutputStream != null) {
                    byteArrayOutputStream.close();
                }
                if (conn != null) {
                    conn.disconnect();
                }

            } catch (Exception e) {
                System.out.println("關閉鏈接出錯!" + e.getMessage());
            }

        }
        //return strBuilder.toString();
    }


    /**
     * @param filePath 文件絕對路徑
     * @param encoding 讀取文件的編碼
     * @return
     * @throws Exception
     * @author King
     */
    public static String readStringFromFile(String filePath, String encoding) {
        File file = new File(filePath);
        System.out.println("文件 " + filePath + "存在與否?: " + file.exists() + "\n");
        String tempLine = null;
        String retStr = "";
        InputStreamReader isr = null;//way1:
//        FileReader fr = null;//way2
        StringBuilder sb = new StringBuilder();
        try {
            if (file.exists()) {
                isr = new InputStreamReader(new FileInputStream(file), encoding);//way1:
//                fr = new FileReader(file);//way2
                BufferedReader br = new BufferedReader(isr);//way1:
//                BufferedReader br =  new BufferedReader(fr);;//way2:
                tempLine = br.readLine();
                while (tempLine != null) {
                    sb.append(tempLine);
                    tempLine = br.readLine();
                }
                retStr = sb.toString();
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (isr != null)
                    isr.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        System.out.println("讀到的文件內容如下:");
        System.out.println(retStr + "\n");
        return retStr;
    }

    /**
     * 通過response返回圖片
     *
     * @param response
     * @param resultArray
     */
    public static void returnImage(byte[] resultArray, HttpServletResponse response) {
        response.setContentType("image/png");
        ByteArrayInputStream bais = new ByteArrayInputStream(resultArray);
        OutputStream outputStream = null;
        try {
            outputStream = response.getOutputStream();

            //創建存放文件內容的數組
            byte[] buff = new byte[1024];
            //所讀取的內容使用n來接收
            int n;
            //當沒有讀取完時,繼續讀取,循環
            while ((n = bais.read(buff)) != -1) {
                //將字節數組的數據全部寫入到輸出流中
                outputStream.write(buff, 0, n);
            }
            //強制將緩存區的數據進行輸出
            outputStream.flush();
            //關流
            outputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bais.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 通過response返回圖片
     */
    public static void writeImageToFile(byte[] resultArray, String path) {
        ByteArrayInputStream bais = new ByteArrayInputStream(resultArray);
        OutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream(path);
            //創建存放文件內容的數組
            byte[] buff = new byte[1024];
            //所讀取的內容使用n來接收
            int n;
            //當沒有讀取完時,繼續讀取,循環
            while ((n = bais.read(buff)) != -1) {
                //將字節數組的數據全部寫入到輸出流中
                outputStream.write(buff, 0, n);
            }
            //強制將緩存區的數據進行輸出
            outputStream.flush();
            //關流
            outputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (bais != null) {
                try {
                    bais.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

 


免責聲明!

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



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