热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

weui上传多图片,压缩,base64编码的示例代码

这篇文章主要介绍了weui上传多图片,压缩,base64编码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

记录一下在做一个报修功能的心路历程,需求功能很简单,一个表单提交,表单包含简单的文字字段以及图片

因为使用的是weui框架,前面的话去找weui的表单和图片上传组件,说实话,weui的组件写的还不错,作为一个不太懂前端的渣渣可以拿来开箱即用

主要是不用调那么多的样式问题,直接上代码:

图片上传

//文件上传js
var tmpl = '
  • ', $gallery = $("#gallery"), $galleryImg = $("#galleryImg"), $uploaderInput = $("#uploaderInput"), $uploaderFiles = $("#uploaderFiles"); $uploaderInput.on("change", function(e) { var src, url = window.URL || window.webkitURL || window.mozURL, files = e.target.files; //这里获取到批量的file var fileNum =fileArr.length; for(var i = 0, len = files.length; i 5) { break; } // fileArr.push(file); if(url) { src = url.createObjectURL(file); } else { src = e.target.result; } var reader = new FileReader() reader.readAsDataURL(file) reader.Onload= function(e) { var image = new Image() //新建一个img标签(还没嵌入DOM节点) image.src = e.target.result image.Onload= function () { var canvas = document.createElement('canvas'), cOntext= canvas.getContext('2d'), imageWidth = image.width / 5.5, //压缩后图片的大小 imageHeight = image.height / 5.5; canvas.width = imageWidth; canvas.height = imageHeight; context.drawImage(image, 0, 0, imageWidth, imageHeight); var data = { base64: canvas.toDataURL('image/jpeg') } mui.ajax({ url: "/file/uploadBase64", type: "POST", async: false, cache: false, processData: false,// 不处理发送的数据 headers: { 'Content-Type': 'application/json' }, data: JSON.stringify(data), success: function(res){ console.log(res) if (res.code==100){ fileArr.push(res.data); //上传完成,前端页面显示 $uploaderFiles.append($(tmpl.replace('#url#', canvas.toDataURL('image/jpeg')))); }else { weui.toast("出错了,请稍后再试", "forbidden"); } }, error:function () { weui.toast("出错了,请稍后再试", "forbidden"); } }); } } } checkPhotoSize(); }); //控制显示5张以内照片 function checkPhotoSize(){ if(fileArr.length>4){ $(".weui-uploader__input-box").hide(); }else{ $(".weui-uploader__input-box").show(); } } var index; //第几张图片 $uploaderFiles.on("click", "li", function() { index = $(this).index(); $galleryImg.attr("style", this.getAttribute("style")); $gallery.fadeIn(100); }); $gallery.on("click", function() { $gallery.fadeOut(100); }); //删除图片 删除图片的代码也贴出来。 $(".weui-gallery__del").click(function() { console.log('删除'+index); $uploaderFiles.find("li").eq(index).remove(); fileArr.splice(index,1); checkPhotoSize(); });

    这里有几个要注意的点

    1、要实现多图片上传,对比了几个UI框架,感觉还是weui的样式做的最好看

    2、考虑到图片大小问题,一开始我使用的是直接将图片文件以数组的形式post给后台,然后后台使用MultipartFile 数组接收,但是这导致有个问题,现在的手机拍照的图片都比较大,随便都有个3-5M一张图片,如果直接post给后台,用户体验不好(速度太慢了),同时也占用了服务器太多资源(主要是带宽和存储空间),所以必须前端先压缩后再上传

    3、前端压缩目前能想到的是使用第三方工具接口(阿里或者七牛云端接口);前端页面利用canvas,进行base64编码,然后发送给后端,显然用后者会比较合适

    最后利用canvas将图片进行base64编码压缩,可以实现到将3-5M的图片图片压缩为100k内,目前实现的是每次上传图片都会保存在服务器上,删除图片的话没法同步删除服务器上的图片,但是这个问题不大,需要修改的话将这个上传服务器的请求搞到点击提交表单的时候再上传图片就好了

    最后贴一下后端接收代码:

     /**
      * 上传图片信息,base64字符串格式
      * @param map
      * @param model
      * @return
      */
     @PostMapping(value = "uploadBase64")
     @ResponseBody
     public Map uploadBase64Image(@RequestBody Map map) throws ParseException, IOException {
      Map imageMap = new HashMap<>();
      String base64 = map.get("base64").toString();
      MultipartFile file = BASE64DecodedMultipartFile.base64ToMultipart(base64);
      //获取文件保存路径
      String fileSavePath = globalConfService.getByKey(StaticConfigUtil.FILE_SAVE_PATH).getConfValue();
      String fileServerPath = globalConfService.getByKey(StaticConfigUtil.FILE_SERVER_PATH).getConfValue();
      fileSavePath = fileSavePath + DateUtil.formatDatetime("yyyy-MM-dd");
      fileServerPath = fileServerPath + DateUtil.formatDatetime("yyyy-MM-dd");
      if (!file.isEmpty()) {
    
       String fileName = file.getOriginalFilename();
       String ext=fileName.substring(fileName.lastIndexOf(".")+1);
    
       String imgName = "/"+UUID.randomUUID()+ "." +ext;
    
       InputStream in = null;
       OutputStream out = null;
       try {
        File serverFile = new File(fileSavePath+imgName);
        //判断文件父目录是否存在
        if(!serverFile.getParentFile().exists()){
         serverFile.getParentFile().mkdir();
        }
        if (!serverFile.exists()) {
         serverFile.createNewFile();
        }
        in = file.getInputStream();
        out = new FileOutputStream(serverFile);
        byte[] b = new byte[1024];
        int len = 0;
        while ((len = in.read(b))!=-1) {
         out.write(b, 0, len);
        }
        out.close();
        in.close();
        String serverPath = fileServerPath + imgName;
        return ResultUtil.successJson(serverPath);
       } catch (Exception e) {
        e.printStackTrace();
        return ResultUtil.errorJson(ErrorEnum.E_40001,e.getMessage());
       } finally {
        if (out != null) {
         out.close();
         out = null;
        }
        if (in != null) {
         in.close();
         in = null;
        }
       }
      } else {
       return ResultUtil.errorJson(ErrorEnum.E_90007);
      }
     }
    /**
     * base64转MultipartFile文件
     *
     * @param base64
     * @return
     */
    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 
    

    总结

    到此这篇关于weui上传多图片,压缩,base64编码的示例代码的文章就介绍到这了,更多相关Weui多图片压缩上传内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


    推荐阅读
    • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
    • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
    • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
    • 开发笔记:加密&json&StringIO模块&BytesIO模块
      篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
    • 如何使用Java获取服务器硬件信息和磁盘负载率
      本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
    • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
    • Python瓦片图下载、合并、绘图、标记的代码示例
      本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
    • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
      本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
    • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
    • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
    • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
    • Node.js学习笔记(一)package.json及cnpm
      本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
    • 本文介绍了DataTables插件的官方网站以及其基本特点和使用方法,包括分页处理、数据过滤、数据排序、数据类型检测、列宽度自动适应、CSS定制样式、隐藏列等功能。同时还介绍了其易用性、可扩展性和灵活性,以及国际化和动态创建表格的功能。此外,还提供了参数初始化和延迟加载的示例代码。 ... [详细]
    • 查询单个functionquery(id){$.ajax({url:smallproductServlet,async:true,type:POST,data:{typ ... [详细]
    • 工作经验谈之-让百度地图API调用数据库内容 及详解
      这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
    author-avatar
    mobiledu2502940947
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有