zoukankan      html  css  js  c++  java
  • 小程序码传前端

    事件起因:

      前端掉后台的生成小程序码返回,同时返回需要的其他业务参数。

    事件分析:

      常用的上传下载是通过一次请求request返回的response,通过response接收文件流,返回前台

    示例代码如下:

    FileInputStream fis = null;
    try {
        
        File file = new File(getFileUrl());
        response.setContentType("image/" + file.getName().substring(file.getName().lastIndexOf(".") + 1));
        OutputStream out = response.getOutputStream();
        fis = new FileInputStream(file);
        byte[] b = new byte[fis.available()];
        fis.read(b);
        out.write(b);
        out.flush();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    或者后台流转文件,返回文件url:

    示例代码如下:

    public static String getLimitQr(String accessToken, String path, String uploadPath) {
        String ctxPath = uploadPath;
        String fileName = "qrCode.png";
        String bizPath = "files";
        String nowday = new SimpleDateFormat("yyyyMMdd").format(new Date());
        String mkdirName = "wxQrCode";
        String ppath = ctxPath + File.separator + bizPath + File.separator + nowday;
        File file = new File(ctxPath + File.separator + bizPath + File.separator + mkdirName);
        if (!file.exists()) {
            file.mkdirs();// 创建文件根目录
        }
        String savePath = file.getPath() + File.separator + fileName;
        File tempFile = new File(savePath);
        if (tempFile.exists()) {
            tempFile.delete();//删除文件
        }
        String qrCode = bizPath + File.separator + mkdirName + File.separator + fileName;
    //        if (ppath.contains("\")) {
    //            ppath = ppath.replace("\", "/");
    //        }
        if (qrCode.contains("\")) {
            qrCode = qrCode.replace("\", "/");
        }
    //        String codeUrl=ppath+"/qrCode.png";
        System.out.print(qrCode);
        System.out.print(savePath);
        try {
            String wxCodeURL = WxCode_Limit_URL.replace("ACCESS_TOKEN", accessToken);
            URL url = new URL(wxCodeURL);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");// 提交模式
            // conn.setConnectTimeout(10000);//连接超时 单位毫秒
            // conn.setReadTimeout(2000);//读取超时 单位毫秒
            // 发送POST请求必须设置如下两行
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
            // 发送请求参数
            JSONObject paramJson = new JSONObject();
            paramJson.put("path", path);
            paramJson.put("width", 530);
            paramJson.put("is_hyaline", true);
            paramJson.put("auto_color", true);
            /**
             * line_color生效
             * paramJson.put("auto_color", false);
             * JSONObject lineColor = new JSONObject();
             * lineColor.put("r", 0);
             * lineColor.put("g", 0);
             * lineColor.put("b", 0);
             * paramJson.put("line_color", lineColor);
             * */
    
            printWriter.write(paramJson.toString());
            // flush输出流的缓冲
            printWriter.flush();
            //开始获取数据
            BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
            OutputStream os = new FileOutputStream(new File(savePath));
            int len;
            byte[] arr = new byte[1024];
            while ((len = bis.read(arr)) != -1) {
                os.write(arr, 0, len);
                os.flush();
            }
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return savePath;
    }
    View Code

    因为这里小程序返回的就是流,如果以文件形式中转,存在存储问题,以及分布式部署访问的问题。因此这里采用处理小程序返回流,转为二进制数组,再base64编码,和其他业务参数,存在data的json串中。

    示例代码如下:

    StringBuilder sb = new StringBuilder();
    //开始获取数据
    BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
    //转字节数组
    ByteArrayOutputStream imageOut = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024*4];
    int n=0;
    while ((n=bis.read(buffer))!=-1){
        imageOut.write(buffer,0,n);
    }
    //转base64
    sb.append(Base64.encode(imageOut.toByteArray()));
    return sb.toString();
  • 相关阅读:
    C#的GroupBy方法是如何工作的
    流媒体技术探索(一)
    战争雷霆-鼠标穿透
    继承与ER图
    从零开始的文档对象模型(结束更新)
    [hackerrank] booking.com
    [lintcode][美国大公司][1.字符串处理]
    [interview] Aug. 2015
    [codility] Lesson 2 Counting Elements
    [codility] Lesson 1 Time Complexity
  • 原文地址:https://www.cnblogs.com/x-jingxin/p/13260150.html
Copyright © 2011-2022 走看看