问题:

  B/S通常都会涉及到文件的上传,普通文件上传使用文件框,后台接收文件即可

  我遇到的问题是要开发一个大文件上传的功能,那就肯定要支持文件的分片

分析:

  1.参考网上的资料后,通常的多文件和大文件上传会用到三种框架

多文件上传的插件常用的有:
1、jquery uploadify 下载【http://www.uploadify.com/download/】
2、jquery file upload 下载【https://github.com/blueimp/jQuery-File-Upload/tags】
3、webuploader 下载 【http://fex.baidu.com/webuploader/download.html】

  2.最后我选的是百度开发的 【webuploader】,网上比较推崇

解决:

  1.新建一个测试页面,引入相关的样式表css,js文件

    注意,要首先引入jquery的js文件,我的页面是嵌套的,首页已经引入

    引入文件清单:

      @ bootstrap的css,js文件

      @ 在【http://fex.baidu.com/webuploader/】这里下载webuploader的压缩包,我这只是引入了

        【webuploader.css】和【webuploader.js】

      @ 引入自己的业务js文件

<!--引入CSS-->
<link rel="stylesheet" type="text/css" href="static/html/bigFileUpload/assets/bootstrap-3.3.7-dist/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="static/html/bigFileUpload/assets/webuploader.css"> <!--官网例子-->
<!--<div id="uploader" class="wu-example">-->
<!--&lt;!&ndash;用来存放文件信息&ndash;&gt;-->
<!--<div id="thelist" class="uploader-list"></div>-->
<!--<div class="btns">-->
<!--<div id="picker">选择文件</div>-->
<!--<button id="ctlBtn" class="btn btn-default">开始上传</button>-->
<!--</div>-->
<!--</div>--> <!--单文件-->
<div id="uploader" class="wu-example">
<!--用来存放文件信息-->
<div id="thelist" class="uploader-list"></div>
<div class="btns">
<div id="attach"></div>
<button id="upload" class="btn btn-default">开始上传</button>
</div>
</div> <!--多文件-->
<!--<div id="uploader1" class="wu-example">-->
<!--&lt;!&ndash;用来存放文件信息&ndash;&gt;-->
<!--<div id="thelist1" class="uploader-list"></div>-->
<!--<div class="btns">-->
<!--<div id="multi"></div>-->
<!--<input type="button" value="上传" id="multiUpload"/>-->
<!--</div>-->
<!--</div>--> <!--引入JS-->
<script type="text/javascript" src="static/html/bigFileUpload/assets/webuploader.js"></script>
<script type="text/javascript" src="static/html/bigFileUpload/assets/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
<script type="text/javascript" src="static/html/bigFileUpload/upload.js"></script>

  2.编写业务js文件

$(function(){

    var $list = $("#thelist");
var uploader;
   // 初始化uploader
uploader = WebUploader.create({
auto:false, //不自动提交,需要点击
pick: {
id: '#attach',
label: '选择文件',
},
server: 'test/save', //后台接收服务
resize: false,
formData: {"Authorization": localStorage.token}, //额外参数传递,可以没有
chunked: true, //分片
chunkSize: 10 * 1024 * 1024, //分片大小指定
threads:1, //线程数量
disableGlobalDnd: true //禁用拖拽
}); //添加文件页面提示
uploader.on( "fileQueued", function( file ) {
$list.html( "<div id='"+ file.id + "' class='item'>" +
"<h4 class='info'>" + file.name + "</h4>" +
"<p class='state'>等待上传...</p>" +
"</div>" );
}); //开进度条
uploader.on( 'uploadProgress', function( file, percentage ) {
var $li = $( '#'+file.id ),
$percent = $li.find('.progress .progress-bar');
if ( !$percent.length ) {
$percent = $('<div class="progress progress-striped active">' +
'<div class="progress-bar" role="progressbar" style="width: 0%">' +
'</div>' +
'</div>').appendTo( $li ).find('.progress-bar');
}
$li.find('p.state').text('上传中');
$percent.css( 'width', percentage * 100 + '%' );
}); //上传成功
uploader.on( "uploadSuccess", function( file ) {
$( "#"+file.id ).find("p.state").text("已上传");
$('#' + file.id).find('.progress').fadeOut();
}); //上传失败
uploader.on( "uploadError", function( file ) {
$( "#"+file.id ).find("p.state").text("上传出错");
uploader.cancelFile(file);
uploader.removeFile(file,true);
}); //点击上传
$("#upload").on("click", function() {
uploader.upload();
}) });

  3.编写后台文件接收文件

package org.triber.portal.upload;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import java.io.*;
import java.util.HashMap;
import java.util.Map; @Slf4j
@RestController
@RequestMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE)
public class UploadController { @Value("${AREA_FILE}")
private String AREA_FILE;//excel下载文件名
@Value("${AREA_DIR}")
private String AREA_DIR;//excel临时存储文件夹 /**
* 上传文件
* @param file
* @return
* @throws IOException
*/
@RequestMapping(value = "/save", produces = {"application/json"})
public Map<String,String> importExcel(@RequestParam MultipartFile file) throws IOException { //获取文件名
String originalFilename = file.getOriginalFilename(); //合并文件
RandomAccessFile raFile = null;
BufferedInputStream inputStream=null;
try{
File dirFile = new File(AREA_DIR, originalFilename);
//以读写的方式打开目标文件
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){
throw new IOException(e.getMessage());
}finally{
try {
if (inputStream != null) {
inputStream.close();
}
if (raFile != null) {
raFile.close();
}
}catch(Exception e){
throw new IOException(e.getMessage());
}
}
     
     //以下信息没用。比较扯淡
//初始化返回信息
Map<String, String> map = new HashMap<String, String>();
String result = "";
int res = -1;
//返回提示信息
map.put("result", result);
return map;
} }

总结:

  说一下我遇到的问题吧,

  网上查了好多资料,看了好多例子,可能例子业务要求高,设置一堆参数,最后发现还是官网靠谱,没有没用的东西,但是你单独拷贝下来会出现无法运行的情况

  额,最后拷贝精简代码,到最小可用,大家可以视情况而定

  我使用的springBoot,后台在接收文件时为 【MultipartFile】

  试了File来接受总是提示我不能接收,后来没办法。只能采用多文件类来接收

  我写的这个例子适用于单文件,而且文件比较大的情况

  据说IE不能上传4g之上的文件,现在没有这个限制了,无论大小,切割后后台组装即可

  后期可能会再加  多文件,重复文件校验,断点续传,块MD5校验  等功能,等功能上来后再为大家更新

记一次SpringBoot使用WebUploader的坑的更多相关文章

  1. 记一次项目使用webuploader爬坑之旅

       因前端页面开发使用的为VUE开发,又要支持IE9,遂只有基于webuploader封装一个上传组件.地址:https://github.com/z719725611/vue-upload-web ...

  2. 记一次SpringBoot 开发中所遇到的坑和解决方法

    记一次SpringBoot 开发中所遇到的坑和解决方法 mybatis返回Integer为0,自动转型出现空指针异常 当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Inte ...

  3. 记一次 Spring 事务配置踩坑记

    记一次 Spring 事务配置踩坑记 问题描述:(SpringBoot + MyBatisPlus) 业务逻辑伪代码如下.理论上,插入数据 t1 后,xxService.getXxx() 方法的查询条 ...

  4. 记一次RabbitMq 安装和配置坑

    记一次RabbitMq 安装和配置坑 正常情况下安装 先安装erl ,在安装rabbitmq 这个在windows下的安装没什么技巧,按照默认一路下一步就ok.安装好后可以到cmd测试是否安装好. 测 ...

  5. 记一次UICollectionView中visibleCells的坑

    记一次UICollectionView中visibleCells的坑 项目的要求是这样的 其实也是一个轮播图,而已,所以依照轮播图的实现原理,这里觉得也很简单,还是利用UICollectionView ...

  6. 教你 Shiro 整合 SpringBoot,避开各种坑

    教你 Shiro 整合 SpringBoot,避开各种坑-----https://www.cnblogs.com/HowieYuan/p/9259638.html

  7. SpringBoot + SpringCloud学习踩坑实记

     踩的坑: 1).springcloud框架中,依赖一直报错,很可能是没有添加springcloud的依赖,或者是依赖的版本号过低.并且springboot也有一个父依赖. 2.springcloud ...

  8. vue-element-admin跟springboot+shiro部署爬坑记

    今天把前端采用vue-element-admin与springboot的项目部署到正是线上,在开发线上很OK的,一放上去我的天啊,坑是真的多阿.下面听我一一道来:我这边采用的是nginx服务器部署. ...

  9. 记一次springboot+mybatis+phoenix在代码集成中的坑

    场景: 希望使用phoenix做查询服务,给服务端提供接口 设计: 通过springboot做restful的接口发布,通过mybatis做phoenix的sql处理,因此是springboot+my ...

随机推荐

  1. yarn-site.xml

    要保证spark on yarn的稳定性,避免报错,就必须保证正确的配置,尤其是yarn-site.xml. 首先来理解一下yarn-site.xml各个参数的意义(引自董的博客) 注:下面<v ...

  2. 【vue】父向子组件传参、子组件向父传参

    1.父向子组件传参 App.vue为父,引入componetA组件之后,则可以在App.vue中使用标签(注意驼峰写法要改成componet-a写法,因为html对大小写不敏感,componenta与 ...

  3. ASP.NET Core MVC中的IActionFilter.OnActionExecuted方法执行时,Controller中Action返回的对象是否已经输出到Http Response中

    我们在ASP.NET Core MVC项目中有如下HomeController: using Microsoft.AspNetCore.Mvc; namespace AspNetCoreActionF ...

  4. windows设置控制台编码格式为UTF-8

    1.运行CMD 2.输入CHCP查看当前编码格式. 3.输入 CHCP 65001设置编码方式为UTF-8 注意,到此处并没有完全修改,只是修改了当前页面,怎么完全修改? 4.右击控制台,选择属性: ...

  5. DDL-数据类型

    一.数值型1.整型tinyint.smallint.mediumint.int/integer.bigint1         2        3          4            8 特 ...

  6. 1006.Sign in and Sign out(25)—PAT 甲级

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...

  7. mysql数据库的系统操作基本操作

    本文主要总结并记录一下简单且常用的mysql 在cmd 窗口中操作的基本命令 命令停止mysql 数据库服务 1.(cmd)命令行 启动:net start mysql 停止:net stop mys ...

  8. [Linux]使用宝塔面板做负载均衡时遇到的问题和解决办法

    最近公司的小程序因为高峰期访问缓慢的问题,打算用负载均衡试试.本人是个新手,在网上找了几篇负载均衡的文章看了看,最后还是用了宝塔面板的负载均衡插件...这个服务器我也是刚刚接手,很多东西都是以前的同事 ...

  9. bootstrap世界探索1——山川河流(文字排版)

    世界到底是什么?其实世界很简单,正所谓一花一世界,一树一菩提,世界就在我们身边.造物神是伟大的,在我看来无论是HTML,css,js都可以看作是一个世界,但是他们是构成宏观世界不可或缺的,正如IU框架 ...

  10. Struts2速记手册

    工作原理 Action类 Action类 普通Action类 私有属性及getter.setter(处理请求参数) execute()方法(处理请求)   实现Action接口 提供常量   继承Ac ...