java前端传base64,后台转成文件并存储的实现

 更新时间:2026年02月04日 17:28:54   作者:果仁栗子糕  
文章介绍了如何实现一个单独的H5页面用于手绘签名并上传服务器,包括如何从扫码跳转的链接中截取参数以及如何将字节码转换为文件上传

需求

单独的H5页面实现手绘签名,然后上传服务器,并修改数据,首先项目中是扫码跳转到H5页面,那链接中需要带参数,怎么截取参数?

下面是截取路径,获得值

var varurl = window.location.search; //获取url中"?"符后的字串
                if (varurl.indexOf("?") != -1) { //判断是否有参数
                    varstr = varurl.substr(1); //从第一个字符开始 因为第0个是?号 获取所有除问号的所有符串
                    var strs = varstr.split("="); //用等号进行分隔 (因为知道只有一个参数 所以直接用等号进分隔 如果有多个参数 要用&号分隔 再用等号进行分隔)
                    console.log(strs[1]); //直接弹出第一个参数 (如果有多个参数 还要进行循环的)
                    id = strs[1];
                }

后台接受字节码并转换成文件上传

@RequestMapping(value = "/uploadBase64", method = {RequestMethod.POST})
    @ResponseBody
    public Object uploadBase64(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String base64String = request.getParameter("signatureBase64");
        if (StringUtils.isBlank(base64String)) {
            return new JsonResult(false, "上传失败", "");
        }
        logger.info("======开始上传图片======");
        String imgUrl = "";
        String msg = "";
        Boolean result = false;
        MultipartFile file = Base64DecodMultipartFileUtil.base64ToMultipart(base64String);
        if (Objects.nonNull(file)) {
            try {
                String path = getCompleteImgPath(request, file);
                imgUrl = path.replace("\\", "/");
                result = true;
                msg = SysCode.SUCCESS.getDesc();
                logger.info("======图片上传成功,路径======" + path.replace("\\", "/"));
            } catch (Exception e) {
                logger.error("图片上传失败:" + e.getMessage(), e);
                e.printStackTrace();
                msg = "上传失败!";
            }
        } else {
            logger.error("图片上传失败");
        }
        logger.info("======图片上传结束======");
        return new JsonResult(result, msg, imgUrl);

    }

//base64转文件
public static MultipartFile base64ToMultipart(String base64) {
   try {
      String[] baseStrs = base64.split(",");
      BASE64Decoder decoder = new BASE64Decoder();
      byte[] b = new byte[0];
      b = decoder.decodeBuffer(baseStrs[1]);
      for (int i = 0; i < b.length; ++i) {
         if (b[i] < 0) {
            b[i] += 256;
         }
      }
      return new Base64DecodMultipartFileUtil(b, baseStrs[0]);
   } catch (IOException e) {
      e.printStackTrace();
      return null;
   }
}
//获取文件路径
public static String getCompleteFilePath(HttpServletRequest request, MultipartFile uploadFile) throws Exception {
    String logoPathDir = SysConstants.TOMCAT_FILE_URL;
    /**
     * 得到文件保存目录的真实路径
     */
    String logoRealPathDir = request.getSession().getServletContext().getRealPath(logoPathDir);
    /**
     * 根据真实路径创建目录
     */
    File logoSaveFile = new File(logoRealPathDir);
    if (!logoSaveFile.exists()) {
        logoSaveFile.mkdirs();
    }
    /**
     * 获取文件的后缀
     */
    System.out.println(uploadFile.getOriginalFilename());
    String suffix = uploadFile.getOriginalFilename().substring(uploadFile.getOriginalFilename().lastIndexOf("."));
    /**
     * 使用UUID生成文件名称
     */
    String imageName = RandomUtil.getUuid() + suffix;// 构建文件名称
    /**
     * 拼成完整的文件保存路径加文件
     */
    String fileName = logoRealPathDir + File.separator + imageName;
    File file = new File(fileName);
    uploadFile.transferTo(file);

    FileChannel in = null;
    FileChannel out = null;
    FileInputStream inStream = null;
    FileOutputStream outStream = null;
    try {
        inStream = new FileInputStream(file);
        outStream = new FileOutputStream(PathUtil.getImgBasePath() + File.separator + imageName);
        in = inStream.getChannel();
        out = outStream.getChannel();
        in.transferTo(0, in.size(), out);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        inStream.close();
        in.close();
        outStream.close();
        out.close();
    }
    return PathUtil.getImgPath(imageName);
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java对ArrayList排序代码示例

    java对ArrayList排序代码示例

    本文通过代码示例给大家介绍java对arraylist排序,代码简洁易懂,感兴趣的朋友一起学习吧
    2015-11-11
  • Spring实例化bean的四种方式详解

    Spring实例化bean的四种方式详解

    这篇文章主要给大家介绍了关于Spring中实例化bean的四种方式:构造方法、静态工厂、实例工厂和FactoryBean,感兴趣的可以了解一下
    2022-06-06
  • Java前后端分离的在线点餐系统实现详解

    Java前后端分离的在线点餐系统实现详解

    这是一个基于SpringBoot+Vue框架开发的在线点餐系统。首先,这是一个前后端分离的项目。具有一个在线点餐系统该有的所有功能,感兴趣的朋友快来看看吧
    2022-01-01
  • 关于application.yml基础配置以及读取方式

    关于application.yml基础配置以及读取方式

    这篇文章主要介绍了关于application.yml基础配置以及读取方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Spring Security放行的接口Knife4j静态资源的问题小结

    Spring Security放行的接口Knife4j静态资源的问题小结

    这篇文章主要介绍了Spring Security使用Knife4j静态资源的问题小结,项目中使用 Spring Security 做身份认证和授权,使用 Knife4j 做接口调试,需要 Spring Security 放行的接口记录在 RequestMatcherConstant 类中,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • Java基础之并发相关知识总结

    Java基础之并发相关知识总结

    随着摩尔定律逐步失效,cpu单核性能达到瓶颈,并发逐渐逐渐得到广泛应用,因而学习了解以及使用并发就显得十分重要,但并发相关的知识比较琐碎,不易系统学习,因而本篇文章参照王宝令老师《Java并发编程》来勾勒出一张“并发全景图”,需要的朋友可以参考下
    2021-05-05
  • Java集合中的LinkedHashSet源码解读

    Java集合中的LinkedHashSet源码解读

    这篇文章主要介绍了Java集合中的LinkedHashSet源码解读,在LinkedHashMap中,双向链表的遍历顺序通过构造方法指定,如果没有指定,则使用默认顺序为插入顺序,即accessOrder=false,需要的朋友可以参考下
    2023-12-12
  • 利用Spring Boot操作MongoDB的方法教程

    利用Spring Boot操作MongoDB的方法教程

    mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多,下面这篇文章主要给大家介绍了利用Spring Boot操作MongoDB的方法教程,需要的朋友可以参考下
    2017-05-05
  • Java源码难点突破Lambda表达式执行原理

    Java源码难点突破Lambda表达式执行原理

    这篇文章主要为大家介绍了Java难点突破Lambda表达式执行原理分析及示例的实现源码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 详解springboot中yml、yaml、properties加载顺序

    详解springboot中yml、yaml、properties加载顺序

    Springboot对于文件配置加载,有着明确的配置加载顺序,下面就来介绍一下springboot中yml、yaml、properties加载顺序,感兴趣的可以了解一下
    2025-11-11

最新评论