zoukankan      html  css  js  c++  java
  • 上传文件不落地转Base64字符串

    1. 问题描述

    1. 因需调用第三方公司的图像识别接口,入参是:证件类型、图像类型、图片base64字符串,采用http+json格式调用。
    2. 本来采用的方式是:前端对图片做base64处理,后端组装下直接调用第三方接口,然后将结果返回给前端展示。然而联调过程中,发现前端对图片转换base64字符串后,大小扩了近一倍,传输到后台后,存在识别不准确,数据丢失的情况,字符太多,后端调试也比较麻烦。

    2. 解决方案

    更改前后端调用方式,采用前端不进行Base64处理,使用文件上传到后端不落地,直接读取文件流,转换成base64字符后,再调用第三方图片识别接口的方式。

    2.1 controller接收前端上传文件

        @RequestMapping(value = "/getTestByFile", method = RequestMethod.POST)
        public Object getTestByFile(@RequestParam MultipartFile file, String cardType, String imgtype) {
            try {
                Object result = testService.getTestByFile(file, cardType, imgtype);
                return new ResponseEntity(result, HttpStatus.OK);
            } catch (Exception e) {
                logger.error("接口", e.getMessage());
                return new ResponseEntity("调用接口(" + e.getMessage() + ")", HttpStatus.INTERNAL_SERVER_ERROR);
            }
        }
    

    2.2 service读取文件流并转换Base64字符

     public Object getTestByFile(MultipartFile file, String cardType, String imgtype) throws Exception {
    
            String imageBase64 = generateBase64(file);
             /**
                无关代码,删除
             **/
            return imageBase64;
        }
    
        public String generateBase64(MultipartFile file) throws Exception {
            if (file == null || file.isEmpty()) {
                throw new RuntimeException("图片不能为空!");
            }
            String fileName = file.getOriginalFilename();
            String fileType = fileName.substring(fileName.lastIndexOf("."));
            if (!".jpg".equals(fileType) && ".png".equals(fileType)) {
                throw new BizException("图片格式仅支持JPG、PNG!");
            }
            byte[] data = null; 
            try {
                InputStream in = file.getInputStream();
                data = new byte[in.available()];
                in.read(data);
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(data);
        }
    

  • 相关阅读:
    JS之Cookie、localStorage与sessionStorage
    ES6之数组的扩展
    iView Form表单与DatePicker日期选择器
    自己实现LinkedList(非所有功能测试通过)
    自己实现基于数组的ArrayList的基本api
    Leetcode 448. 找到所有数组中消失的数字
    第六届福建省大学生程序设计竞赛不完全题解
    2016多校联合训练contest4 1012Bubble Sort
    2016 Multi-University Training Contest 2 第一题Acperience
    HDU 5726 GCD (2016 Multi-University Training Contest 1)
  • 原文地址:https://www.cnblogs.com/ruanjianlaowang/p/11182460.html
Copyright © 2011-2022 走看看