Spring Boot 利用WebUploader进行文件上传功能

Web Uploader简介

WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, android 4+。两套运行时,同样的调用方式,可供用户任意选用。采用大文件分片并发上传,极大的提高了文件上传效率。

我们这里使用官网的一个例子来实现我们个人头像的上传。

我们的重点是在Spring Boot项目中利用WebUploader如何进行文件上传,所以直接实现一个简单的功能,仅供参考。

下面是一个从官网下载来的示例:带剪裁的图片上传功能。

我们利用示例来改造项目中的个人头像上传。

效果看起来是这样的:

首先我们来改造我们的WebUploader示例代码。

以下都是我项目中的部分代码:

(function( factory ) {
  if ( !window.jQuery ) {
    alert('jQuery is required.')
  }
  jQuery(function() {
    factory.call( null, jQuery );
  });
})
(function( $ ) {
// -----------------------------------------------------
// ------------ START ----------------------------------
// -----------------------------------------------------
// ---------------------------------
// --------- Uploader -------------
// ---------------------------------
  var Uploader = (function() {
    // -------setting-------
    // 如果使用原始大小,超大的图片可能会出现 Croper UI 卡顿,所以这里建议先缩小后再crop.
    var FRAME_WIDTH = 1600;
    var _ = WebUploader;
    var Uploader = _.Uploader;
    var uploaderContainer = $('.uploader-container');
    var uploader, file;
    if ( !Uploader.support() ) {
      alert( 'Web Uploader 不支持您的浏览器!');
      throw new Error( 'WebUploader does not support the browser you are using.' );
    }
    // hook,
    // 在文件开始上传前进行裁剪。
    Uploader.register({
      'before-send-file': 'cropImage'
    }, {
      cropImage: function( file ) {
        var data = file._cropData,
          image, deferred;
        file = this.request( 'get-file', file );
        deferred = _.Deferred();
        image = new _.Lib.Image();
        deferred.always(function() {
          image.destroy();
          image = null;
        });
        image.once( 'error', deferred.reject );
        image.once( 'load', function() {
          image.crop( data.x, data.y, data.width, data.height, data.scale );
        });
        image.once( 'complete', function() {
          var blob, size;
          // 移动端 UC / qq 浏览器的无图模式下
          // ctx.getImageData 处理大图的时候会报 Exception
          // INDEX_SIZE_ERR: DOM Exception 1
          try {
            blob = image.getAsBlob();
            size = file.size;
            file.source = blob;
            file.size = blob.size;
            file.trigger( 'resize', blob.size, size );
            deferred.resolve();
          } catch ( e ) {
            console.log( e );
            // 出错了直接继续,让其上传原始图片
            deferred.resolve();
          }
        });
        file._info && image.info( file._info );
        file._meta && image.meta( file._meta );
        image.loadFromBlob( file.source );
        return deferred.promise();
      }
    });
    return {
      init: function( selectCb ) {
        uploader = new Uploader({
          pick: {
            id: '#filePicker',
            multiple: false
          },
          // 设置用什么方式去生成缩略图。
          thumb: {
            quality: 70,
            // 不允许放大
            allowMagnify: false,
            // 是否采用裁剪模式。如果采用这样可以避免空白内容。
            crop: false
          },
          // 禁掉分块传输,默认是开起的。
          chunked: false,
          // 禁掉上传前压缩功能,因为会手动裁剪。
          compress: false,
          // fileSingleSizeLimit: 2 * 1024 * 1024,
          server: 'StudentImgFileUpload',
          swf: $.trim($("#BASE_URL").val()) + '/static/webuploader/Uploader.swf',
          fileNumLimit: 1,
          // 只允许选择图片文件。
          accept: {
            title: 'Images',
            // extensions: 'gif,jpg,jpeg,bmp,png',
            // mimeTypes: 'image/*'
            extensions: 'jpg,jpeg,png',
            //解决WebUploader chrome 点击上传文件选择框会延迟几秒才会显示 反应很慢
            mimeTypes: 'image/jpg,image/jpeg,image/png'  //修改这行
          }
          //formData: {"Authorization": localStorage.token}, //额外参数传递,可以没有
          // chunked: true, //分片
          // chunkSize: 10 * 1024 * 1024, //分片大小指定
          // threads:1, //线程数量
          // disableGlobalDnd: true //禁用拖拽
          // onError: function() {
          //   var args = [].slice.call(arguments, 0);
          //   alert(args.join('\n'));
          // }
        });
        uploader.on('fileQueued', function( _file ) {
          file = _file;
          uploader.makeThumb( file, function( error, src ) {
            if ( error ) {
              alert('不能预览');
              return;
            }
            selectCb( src );
          }, FRAME_WIDTH, 1 );  // 注意这里的 height 值是 1,被当成了 100% 使用。
        });
        /**
         * 验证文件格式以及文件大小
         */
        uploader.on("error", function (type) {
          if (type == "Q_TYPE_DENIED") {
            showInfo("请上传JPG、JEPG、PNG、格式文件");
          }
        });
        // 文件上传成功,给item添加成功class, 用样式标记上传成功。
        uploader.on( 'uploadSuccess', function( file ) {
          showInfo("上传成功");
        });
        // 文件上传失败,显示上传出错。
        uploader.on( 'uploadError', function( file ) {
          showInfo("上传失败");
        });
      },
      crop: function( data ) {
        var scale = Croper.getImageSize().width / file._info.width;
        data.scale = scale;
        file._cropData = {
          x: data.x1,
          y: data.y1,
          width: data.width,
          height: data.height,
          scale: data.scale
        };
      },
      upload: function() {
        uploader.upload();
      }
    }
  })();
// ---------------------------------
// --------- Crpper ---------------
// ---------------------------------
  var Croper = (function() {
    var container = $('.cropper-wraper');
    var $image = container.find('.img-container img');
    var btn = $('.upload-btn');
    var isBase64Supported, callback;
    $image.cropper({
      aspectRatio: 4 / 4,
      preview: ".img-preview",
      done: function(data) {
        // console.log(data);
      }
    });
    function srcWrap( src, cb ) {
      // we need to check this at the first time.
      if (typeof isBase64Supported === 'undefined') {
        (function() {
          var data = new Image();
          var support = true;
          data.onload = data.onerror = function() {
            if( this.width != 1 || this.height != 1 ) {
              support = false;
            }
          }
          data.src = src;
          isBase64Supported = support;
        })();
      }
      if ( isBase64Supported ) {
        cb( src );
      } else {
        // otherwise we need server support.
        // convert base64 to a file.
        // $.ajax('', {
        //   method: 'POST',
        //   data: src,
        //   dataType:'json'
        // }).done(function( response ) {
        //   if (response.result) {
        //     cb( response.result );
        //   } else {
        //     alert("预览出错");
        //   }
        // });
      }
    }
    btn.on('click', function() {
      callback && callback($image.cropper("getData"));
      return false;
    });
    return {
      setSource: function( src ) {
        // 处理 base64 不支持的情况。
        // 一般出现在 ie6-ie8
        srcWrap( src, function( src ) {
          $image.cropper("setImgSrc", src);
        });
        container.removeClass('webuploader-element-invisible');
        return this;
      },
      getImageSize: function() {
        var img = $image.get(0);
        return {
          width: img.naturalWidth,
          height: img.naturalHeight
        }
      },
      setCallback: function( cb ) {
        callback = cb;
        return this;
      },
      disable: function() {
        $image.cropper("disable");
        return this;
      },
      enable: function() {
        $image.cropper("enable");
        return this;
      }
    }
  })();
// ------------------------------
// -----------logic--------------
// ------------------------------
  var container = $('.uploader-container');
  Uploader.init(function( src ) {
    Croper.setSource( src );
    // 隐藏选择按钮。
    container.addClass('webuploader-element-invisible');
    // 当用户选择上传的时候,开始上传。
    Croper.setCallback(function( data ) {
      Uploader.crop(data);
      Uploader.upload();
    });
  });
// -----------------------------------------------------
// ------------ END ------------------------------------
// -----------------------------------------------------
});

还有页面的部分代码:

下面是Controller部分的代码:

 @RequestMapping(value="/student/StudentImgFileUpload", method=RequestMethod.POST)
  @ResponseBody
  String studentImgFileUpload(@RequestParam MultipartFile file, HttpServletRequest request){
    logger.info("学生头像上传....")
    //获取文件名
    String originalFilename = file.getOriginalFilename()
    logger.info("上传文件名:" + originalFilename)
    String realPath = request.getServletContext().getRealPath("/public/student/")
    String uploadFileName = System.currentTimeMillis()+"_"+ originalFilename
    logger.info("获取上传路径:" + realPath + ", 上传的真实文件名:" + uploadFileName)
    boolean flag = true

    //合并文件
    RandomAccessFile raFile = null
    BufferedInputStream inputStream = null
    try{
      File dirFile = new File(realPath, uploadFileName)
      //以读写的方式打开目标文件
      raFile = new RandomAccessFile(dirFile, "rw")
      raFile.seek(raFile.length())
      inputStream = new BufferedInputStream(file.getInputStream())
      byte[] buf = new byte[1024]
      int length = 0
      while ((length = inputStream.read(buf)) != -1) {
        raFile.write(buf, 0, length)
      }
    }catch(Exception e){
      flag = false
      logger.info("上传出错:" + e.getMessage())
      throw new IOException(e.getMessage())
    }finally{
      try {
        if (inputStream != null) {
          inputStream.close()
        }
        if (raFile != null) {
          raFile.close()
        }
      }catch(Exception e){
        flag = false
        logger.info("上传出错:" + e.getMessage())
        throw new IOException(e.getMessage())
      }
    }
  }

这样就简单实现了在Spring Boot项目中使用WebUploader进行文件上传的功能。

总结

以上所述是小编给大家介绍的Spring Boot 利用WebUploader进行文件上传功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • SpringBoot实现文件上传下载功能小结

    最近做的一个项目涉及到文件上传与下载.前端上传采用百度webUploader插件.有关该插件的使用方法还在研究中,日后整理再记录.本文主要介绍SpringBoot后台对文件上传与下载的处理. 单文件上传 // 单文件上传 @RequestMapping(value = "/upload") @ResponseBody public String upload(@RequestParam("file") MultipartFile file) { try { if (

  • Spring Boot实现文件上传示例代码

    使用SpringBoot进行文件上传的方法和SpringMVC差不多,本文单独新建一个最简单的DEMO来说明一下. 主要步骤包括: 1.创建一个springboot项目工程,本例名称(demo-uploadfile). 2.配置 pom.xml 依赖. 3.创建和编写文件上传的 Controller(包含单文件上传和多文件上传). 4.创建和编写文件上传的 HTML 测试页面. 5.文件上传相关限制的配置(可选). 6.运行测试. 项目工程截图如下: 文件代码: <dependencies>

  • 详解SpringBoot文件上传下载和多文件上传(图文)

    最近在学习SpringBoot,以下是最近学习整理的实现文件上传下载的Java代码: 1.开发环境: IDEA15+ Maven+JDK1.8 2.新建一个maven工程: 3.工程框架 4.pom.xml文件依赖项 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation

  • spring MVC + bootstrap实现文件上传示例(带进度条)

    最近学习了bootstrap,有结合了spring MVC写了个文件上传的示例,留做笔记,废话不多说,直接上代码 监听器类FileUploadProgressListener.Java package com.gpl.web.listener; import javax.servlet.http.HttpSession; import org.apache.commons.fileupload.ProgressListener; import org.springframework.stereo

  • springboot实现文件上传和下载功能

    spring boot 引入"约定大于配置"的概念,实现自动配置,节约了开发人员的开发成本,并且凭借其微服务架构的方式和较少的配置,一出来就占据大片开发人员的芳心.大部分的配置从开发人员可见变成了相对透明了,要想进一步熟悉还需要关注源码. 1.文件上传(前端页面): <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/lo

  • Spring boot实现文件上传实例(多文件上传)

    文件上传主要分以下几个步骤: (1)新建maven java project: (2)在pom.xml加入相应依赖: (3)新建一个表单页面(这里使用thymleaf); (4)编写controller; (5)测试: (6)对上传的文件做一些限制: (7)多文件上传实现 (1)新建maven Java project 新建一个名称为spring-boot-fileupload maven Java项目: (2)在pom.xml加入相应依赖: 加入相应的maven依赖,具体看以下解释: <pro

  • Spring Boot 利用WebUploader进行文件上传功能

    Web Uploader简介 WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, android 4+.两套运行时,同样的调用方式,可供用户任意选用.采用大文件分片并发上传,极大的提高了文件上传效率. 我们这里使用官网的一个例子来实现我们个人头像的上传. 我们的重点是在Spring Boo

  • Spring Boot 2.x 实现文件上传功能

    文件上传的功能实现是我们做Web应用时候最为常见的应用场景,比如:实现头像的上传,Excel文件数据的导入等功能,都需要我们先实现文件的上传,然后再做图片的裁剪,excel数据的解析入库等后续操作. 今天通过这篇文章,我们就来一起学习一下如何在Spring Boot中实现文件的上传. 动手试试 第一步:创建一个基础的Spring Boot项目,如果还不会的话就先看看这篇<快速入门>. 第二步:在pom.xml中引入模版引擎依赖: <dependency> <groupId&g

  • Spring boot + LayIM + t-io 实现文件上传、 监听用户状态的实例代码

    前言 今天的主要内容是:LayIM消息中图片,文件的上传对接.用户状态的监听.群在线人数的监听.下面我将挨个介绍. 图片上传 关于Spring boot中的文件上传的博客很多,我也是摘抄了部分代码.上传部分简单介绍,主要介绍在开发过程中遇到的问题.首先我们看一下LayIM的相应的接口: layim.config({ //上传图片接口 ,uploadImage: {url: '/upload/file'} //上传文件接口 ,uploadFile: {url: '/upload/file'} //

  • Spring Cloud中FeignClient实现文件上传功能

    项目概况:Spring Cloud搭的微服务,使用了eureka,FeignClient,现在遇到FeignClient调用接口时不支持上传文件, 百度到两种方案,一种是使用feign-form和feign-form-spring库来做,源码地址. 具体的使用方法是加入maven依赖 <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form-spring&l

  • 利用MultipartFile实现文件上传功能

    在java中上传文件似乎总有点麻烦,没.net那么简单,记得最开始的时候用smartUpload实现文件上传,最近在工作中使用spring的MultipartFile实现文件上传,感觉挺简单,在这里和大家分享一下. 一.主要有两个java类,和一般的servlet放在一起即可. 1.FileUploadBean.java package chb.demo.web; import org.springframework.web.multipart.MultipartFile; /** * @aut

  • Spring Boot 会员管理系统之处理文件上传功能

    温馨提示 Spring Boot会员管理系统的中,需要涉及到Spring框架,SpringMVC框架,Hibernate框架,thymeleaf模板引擎.所以,可以学习下这些知识.当然,直接入门的话使用是没问题,但是,涉及到一些异常和原理的话可能就有些困难. 1. 前端部分 在前端部分addMember.html是通过form表单来提交会员的信息,其中就包括了图片上传功能(这里涉及了文件上传操作),表单部分代码如下: <form th:action="@{/admin/addMember}

  • Spring boot实现文件上传功能

    本文实例为大家分享了Spring boot实现文件上传的具体代码,供大家参考,具体内容如下 1. 创建一个Maven的web工程,然后配置pom.xml文件,增加依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>1.0.2.RELEASE</v

  • Spring boot 实现单个或批量文件上传功能

    一:添加依赖: <!-- thymeleaf模板插件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- jsp依赖 --> <dependency> <groupId>j

  • spring boot如何实现切割分片上传

    这篇文章主要介绍了spring boot如何实现切割分片上传,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 文件上传是web开发中经常会遇到的 springboot的默认配置为10MB,大于10M的是传不上服务器的,需要修改默认配置 但是如果修改支持大文件又会增加服务器的负担. 当文件大于一定程度时,不仅服务器会占用大量内存,而且http传输极可能会中断. 可以采用切割分片上传 html5提供的文件API中可以轻松的对文件进行分割切片,然后通过

  • Spring实现文件上传功能

    本篇文章,我们要来做一个Spring的文件上传功能: 1. 创建一个Maven的web工程,然后配置pom.xml文件,增加依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>1.0.2.RELEASE</version> </dep

随机推荐