WebUploader多图片上传

WebUploder

官网:http://fex.baidu.com/webuploader/

此插件适用于没有使用前端框架的程序。如使用vue,可直接使用Element中的上传组件

实现步骤

  1. 官网下载代码(下面会提供自己用到的文件下载路径)

  2. 页面引入 webuploder 资源

  3. 页面绘制图片框、选择按钮和保存按钮

  4. 触发上传事件,后台接收图片并返回存储路径

  5. 触发保存事件,后台将图片路径及对应数据入库

实现后的页面效果

选择多图上传

上传后效果图

前台代码

  1. 引入资源

    下载地址:https://files-cdn.cnblogs.com/files/blogs/716958/WebUploader.zip

    <!--引入CSS ,webuploder只有几个基础样式,在该css内添加一些自己的样式-->
    <link rel="stylesheet" type="text/css" href="webuploader文件夹/webuploader.css">
    <!--引入JS-->
    <script type="text/javascript" src="webuploader文件夹/webuploader.js"></script>
    <!--imgUploader.js 所有js功能事件均在该文件内实现(自己封装的)-->
    <script type="text/javascript" src="webuploader文件夹/webuploader.js"></script>
    <!--SWF在初始化的时候指定,在后面将展示-->
  1. 绘制图片框、选择按钮和保存按钮

    <div>
       <div id="fileList" class="uploader-list">&nbsp;</div>
       <!-- 这里div内添加 &nbsp; 是故意而为之,后面会说原因-->
       <div id="filePicker">选择图片</div>
    </div>
  2. 前端JS

    /** 多图片上传 start */
    // 多图片数组,每次上传或删除都会改变该数组,用于最后保存入库的数据
    var imgFileArray = new Array();
    function imgFilePath(id,filePath,fileName) { // 用来存储每一次上传的图片路径
       this.id = id;
       this.filePath = filePath;
       this.fileName = fileName;
    }
    // 初始化WebUploader实例
    var uploader = WebUploader.create({
       // 选完文件后,是否自动上传(这里选择自动上传)
       auto: true,
       // swf文件路径(对应修改为自己的地址)
       swf: webUrl + '/resource/webuploader/Uploader.swf',
       // 文件接收服务端(对应修改为自己的地址)
       server: webUrl + '/datainfo/moon/uploadImg.action',
       // 选择文件的按钮。可选。
       // 内部根据当前运行是创建,可能是input元素,也可能是flash.
       pick: '#filePicker',
       // 只允许选择图片文件。
       accept: {
           title: 'Images',
           extensions: 'gif,jpg,jpeg,bmp,png',
           mimeTypes: 'image/*'
      }
    });
    // 当有文件添加进来的时候(可根据自己需要进行修改)
    uploader.on( 'fileQueued', function( file ) {
       let $li = $(
           '<div id="' + file.id + '" class="thumbnail">' +
           '<div><span class="info">' + file.name + '</span><span class="delImg" onclick="delImgFile(this)">X</span></div>' +
           '<img>' +
           '</div>'
          ),
           $img = $li.find('img');
       makeFileListNbsp();
       $("#fileList").append( $li );
       // 创建缩略图
       // 如果为非图片文件,可以不用调用此方法。
       // thumbnailWidth x thumbnailHeight 为 100 x 100
       let thumbnailWidth = 315; // 可根据自己需要修改参数值
       let thumbnailHeight = 150;
       uploader.makeThumb( file, function( error, src ) {
           if ( error ) {
               $img.replaceWith('<span>不能预览</span>');
               return;
          }
           $img.attr( 'src', src );
      }, thumbnailWidth, thumbnailHeight );
    });
    // 文件上传成功,给item添加成功class, 用样式标记上传成功。
    uploader.on( 'uploadSuccess', function( file,response ) { // response为后台返回值
       $( '#'+file.id ).addClass('upload-state-done');
       // 将每次上传的图片路径存到数组中
       imgFileArray.push(new imgFilePath(response.id,response.filePath,response.fileName));
    });
    // 当所有文件上传结束时触发。
    uploader.on( 'uploadFinished', function( file ) {
       //console.log('----所有文件上传结束---')
    });

    // 文件上传失败,显示上传出错。
    uploader.on( 'uploadError', function( file ) {
       //console.log('----上传失败---')
    });

    // 删除图片(可根据自己需要进行修改)
    function delImgFile(del) {
       let $_imgFile = $(del).parent().parent();
       let imgFileId = $_imgFile.attr('id');
       if (isNaN(imgFileId)) { // 区分是否为非数字
           //console.log('---未入库,现上传图片---')
           uploader.removeFile(uploader.getFile(imgFileId),true); // 对应删除webupload中对应的队列
           let index = imgFileArray.map(item => item.id).indexOf(imgFileId); // 找对应ID的下标
           imgFileArray.splice(index,1);// 对应删除自己存储的图片路径数组
           $_imgFile.remove(); // 移除对应的图片框
      } else {
           //console.log('---已入库的图片(回显使用)---')
           if(confirm("确定删除原有图片吗?")){
               $.ajax({
                   url : webUrl+'/datainfo/moon/deleteImg.action',
                   type :'post',
                   dataType: 'json',
                   data : {imgId:imgFileId},
                   success: function(data) {
                       //console.log("图片已删除")
                       $_imgFile.remove(); // 移除对应的图片框
                  },
                   error: function () {
                       alert('图片删除失败,请刷新页面重试!')
                  }
              })
          }
      }
       makeFileListNbsp();
    }
    // 点击上传,开始上传文件(经测试,有几个文件就调几次后台)*此次功能为用到
    function uploadImgFile() {
       uploader.upload();
    }
    // 获取 webupload中存储的文件队列 *此次功能为用到
    function getFiles() {
       console.log( uploader.getFiles() );
       console.log(uploader.getStats('queueNum')) // 获取 webupload 文件队列中文件的状态,例如上传成功数,失败数,删除数等
    }
    // 销毁实例和数据
    function destroyUploader() {
       //uploader.destroy(); // 销毁实例
       imgFileArray = [];
       $("#fileList").empty();
       uploader.reset(); // 重置uploader文件队列(清空队列)
    }
    // 处理 由于使用 display:table ,导致无内容高度失效问题
    function makeFileListNbsp() {
       let $_list = $("#fileList");
       let $_listHtml = $_list.html().trim();
       if ($_listHtml == '&nbsp;') {
           $_list.empty();
      } else if($_listHtml == '') {
           $_list.append('&nbsp;');
      }
    }
    /** 多图片上传 end */

     

后台代码

controller层

// 上传图片
@ResponseBody
@RequestMapping("/uploadImg")
public Map<String,Object> uploadImg(String id, HttpServletRequest request) {
   Map<String, Object> map = imageService.uploadImg(request);
   map.put("id",id);
   return map;
}

server层

public Map<String,Object> uploadImg(HttpServletRequest request) {
   String path = init.getImagePath(); // 这里改成自己存放图片的路径
   MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
   Map<String,Object> map = new HashMap<>();
   Iterator<String> it = multipartRequest.getFileNames();
   if (it.hasNext()) {
       String key = (String) it.next();
       MultipartFile mulfile = multipartRequest.getFile(key);
       String fileName = mulfile.getOriginalFilename();
       map.put("fileName",fileName);// 保留原始文件名
       String pre = fileName.substring(fileName.lastIndexOf("."));
       String directory = checkFile();
       String filePath = directory + File.separator + new Date().getTime() + pre;
       // 解决window无法预览图片问题
       map.put("filePath",filePath.replaceAll("\\\\", "/"));
       File file = new File(path + File.separator + filePath);
       try {
           mulfile.transferTo(file);
      } catch (Exception e) {
           e.printStackTrace();
      }
  }
   return map;
}
// 按月生成文件夹
private String checkFile() {
   String path = init.getImagePath(); // 这里改成自己存放图片的路径
   String directory = DateUtil.date2String(new Date(), "YYYYMM");
   String filePath = path + File.separator + directory;
   File file = new File(filePath);
   if (!file.exists()) {
       file.mkdirs();
  }
   return directory;
}

 

posted @ 2021-11-23 18:56  迷路小孩  阅读(378)  评论(0)    收藏  举报