最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 利用WebUploader進(jìn)行文件上傳功能

 更新時間:2018年03月22日 10:18:05   作者:c.  
本文的重點是給大家介紹在Spring Boot項目中利用WebUploader如何進(jìn)行文件上傳,本文通過示例代碼給大家介紹,需要的朋友參考下吧

Web Uploader簡介

WebUploader是由Baidu WebFE(FEX)團隊開發(fā)的一個簡單的以HTML5為主,F(xiàn)LASH為輔的現(xiàn)代文件上傳組件。在現(xiàn)代的瀏覽器里面能充分發(fā)揮HTML5的優(yōu)勢,同時又不摒棄主流IE瀏覽器,沿用原來的FLASH運行時,兼容IE6+,iOS 6+, android 4+。兩套運行時,同樣的調(diào)用方式,可供用戶任意選用。采用大文件分片并發(fā)上傳,極大的提高了文件上傳效率。

我們這里使用官網(wǎng)的一個例子來實現(xiàn)我們個人頭像的上傳。

我們的重點是在Spring Boot項目中利用WebUploader如何進(jìn)行文件上傳,所以直接實現(xiàn)一個簡單的功能,僅供參考。

下面是一個從官網(wǎng)下載來的示例:帶剪裁的圖片上傳功能。

我們利用示例來改造項目中的個人頭像上傳。

效果看起來是這樣的:

首先我們來改造我們的WebUploader示例代碼。

以下都是我項目中的部分代碼:

(function( factory ) {
  if ( !window.jQuery ) {
    alert('jQuery is required.')
  }
  jQuery(function() {
    factory.call( null, jQuery );
  });
})
(function( $ ) {
// -----------------------------------------------------
// ------------ START ----------------------------------
// -----------------------------------------------------
// ---------------------------------
// --------- Uploader -------------
// ---------------------------------
  var Uploader = (function() {
    // -------setting-------
    // 如果使用原始大小,超大的圖片可能會出現(xiàn) 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,
    // 在文件開始上傳前進(jìn)行裁剪。
    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 );
            // 出錯了直接繼續(xù),讓其上傳原始圖片
            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
          },
          // 設(shè)置用什么方式去生成縮略圖。
          thumb: {
            quality: 70,
            // 不允許放大
            allowMagnify: false,
            // 是否采用裁剪模式。如果采用這樣可以避免空白內(nèi)容。
            crop: false
          },
          // 禁掉分塊傳輸,默認(rèn)是開起的。
          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 點擊上傳文件選擇框會延遲幾秒才會顯示 反應(yīng)很慢
            mimeTypes: 'image/jpg,image/jpeg,image/png'  //修改這行
          }
          //formData: {"Authorization": localStorage.token}, //額外參數(shù)傳遞,可以沒有
          // chunked: true, //分片
          // chunkSize: 10 * 1024 * 1024, //分片大小指定
          // threads:1, //線程數(shù)量
          // 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('不能預(yù)覽');
              return;
            }
            selectCb( src );
          }, FRAME_WIDTH, 1 );  // 注意這里的 height 值是 1,被當(dāng)成了 100% 使用。
        });
        /**
         * 驗證文件格式以及文件大小
         */
        uploader.on("error", function (type) {
          if (type == "Q_TYPE_DENIED") {
            showInfo("請上傳JPG、JEPG、PNG、格式文件");
          }
        });
        // 文件上傳成功,給item添加成功class, 用樣式標(biāo)記上傳成功。
        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("預(yù)覽出錯");
        //   }
        // });
      }
    }
    btn.on('click', function() {
      callback && callback($image.cropper("getData"));
      return false;
    });
    return {
      setSource: function( src ) {
        // 處理 base64 不支持的情況。
        // 一般出現(xiàn)在 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');
    // 當(dāng)用戶選擇上傳的時候,開始上傳。
    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("學(xué)生頭像上傳....")
    //獲取文件名
    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)
      //以讀寫的方式打開目標(biāo)文件
      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())
      }
    }
  }

這樣就簡單實現(xiàn)了在Spring Boot項目中使用WebUploader進(jìn)行文件上傳的功能。

總結(jié)

以上所述是小編給大家介紹的Spring Boot 利用WebUploader進(jìn)行文件上傳功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java中數(shù)組協(xié)變和范型不變性踩坑記錄

    Java中數(shù)組協(xié)變和范型不變性踩坑記錄

    數(shù)組的協(xié)變性來源于數(shù)組的一個優(yōu)勢,這篇文章主要給大家介紹了關(guān)于Java中數(shù)組協(xié)變和范型不變性踩坑的一些內(nèi)容,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Spring Boot Actuator監(jiān)控端點小結(jié)

    Spring Boot Actuator監(jiān)控端點小結(jié)

    這篇文章主要介紹了Spring Boot Actuator監(jiān)控端點小結(jié),需要的朋友可以參考下
    2017-06-06
  • 如何修改覆蓋spring boot默認(rèn)日志策略logback詳解

    如何修改覆蓋spring boot默認(rèn)日志策略logback詳解

    這篇文章主要給大家介紹了關(guān)于如何修改覆蓋spring boot默認(rèn)日志策略logback的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • java this super使用方法詳解

    java this super使用方法詳解

    Java中this、super關(guān)鍵字的用法簡單說明:super是Java語言的保留字,用來指向類的超類,本文將詳細(xì)介紹,需要的朋友可以參考下
    2012-12-12
  • Java靜態(tài)static關(guān)鍵字原理詳解

    Java靜態(tài)static關(guān)鍵字原理詳解

    這篇文章主要介紹了Java靜態(tài)static關(guān)鍵字原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Spring中七種事務(wù)傳播機制詳解

    Spring中七種事務(wù)傳播機制詳解

    這篇文章主要介紹了Spring中七種事務(wù)傳播機制詳解,Spring在TransactionDefinition接口中規(guī)定了7種類型的事務(wù)傳播行為,Propagation枚舉則引用了這些類型,開發(fā)過程中我們一般直接用Propagation枚舉,需要的朋友可以參考下
    2024-01-01
  • Spring Validation方法實現(xiàn)原理分析

    Spring Validation方法實現(xiàn)原理分析

    這篇文章主要介紹了Spring Validation實現(xiàn)原理分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • java使用FFmpeg合成視頻和音頻并獲取視頻中的音頻等操作(實例代碼詳解)

    java使用FFmpeg合成視頻和音頻并獲取視頻中的音頻等操作(實例代碼詳解)

    這篇文章主要介紹了java使用FFmpeg合成視頻和音頻并獲取視頻中的音頻等操作,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • mybatis中#{}和${}的區(qū)別詳解

    mybatis中#{}和${}的區(qū)別詳解

    本文主要介紹了mybatis中#{}和${}的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • MVC框架自定義實現(xiàn)過程

    MVC框架自定義實現(xiàn)過程

    這篇文章主要介紹了MVC框架自定義實現(xiàn)過程,通過搞懂什么是MVC以及MVC的運行原理然后再去理解其演繹過程,本文附含了詳細(xì)的思維導(dǎo)圖幫助大家更好的理解MVC
    2021-08-08

最新評論

措美县| 乐都县| 宁陵县| 澄江县| 汤原县| 吉木乃县| 济南市| 泸州市| 克什克腾旗| 阿鲁科尔沁旗| 林甸县| 讷河市| 固原市| 新蔡县| 凌海市| 莱西市| 昂仁县| 板桥市| 贞丰县| 财经| 昌邑市| 石首市| 石阡县| 临沧市| 客服| 辽阳县| 沽源县| 平罗县| 达尔| 富阳市| 昭平县| 福清市| 诸城市| 迁西县| 鲁甸县| 汝南县| 灵丘县| 盐亭县| 海林市| 大厂| 邹平县|