批量处理1——文件的上传(bootstrap+Ajax+SSM)

批量处理1——文件的上传(bootstrap+Ajax+SSM)
批量处理2——Java花式处理EXCEL
批量处理3——Excel文件导出
批量处理4——java处理压缩文件

Java知多少——相对路径和绝对路径
HTTP知多少——Content-disposition(文件下载)

1. bootstrap实现前端上传模板

上传文件
<div id="batchModal" class="modal w600 fade" tabindex="-1" role="dialog">
  <div class="modal-content">
    <div class="modal-header">
      <button type="button" class="close" data-dismiss="modal" aria-label="Close">
        <span aria-hidden="true">&times;</span></button>
      <h4 class="modal-title">批量操作</h4></div>
    <div class="modal-body">
      <div class="w600">
        <h4>一.请按照文件模版格式准确导入文件:</h4>
        <a href="./batch/downTemplate" target="_Blank">下载文件模板</a>
        <h5>注意事项:</h5>
        <ul>
          <li>按EXCEL模版填写数据,不可私自删除列和修改列名;</li>
          <li>必填项不可删除且必须填写;</li>
          <li>单次最大支持100笔。</li></ul>
        <h4>二.请选择要导入的数据文件:</h4>
        <form id="batchForm" action="">
          <input type="file" name="XXX" id="batchFile" class="file-loading" style="display:none" onchange="$('#batchFilename').val($(this).val());" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" />
          <div class="input-group col-md-7">
            <input id="batchFilename" class="form-control filename" type="text" />
            <a class="btn btn-default btn-sm input-group-addon" onclick="$('input[id=batchFile]').click();">
              <i class="fa fa-file-image-o"></i>选择文件</a>
          </div>
        </form>
      </div>
    </div>
    <div class="modal-footer">
      <button id="batchButton" type="button" class="btn green" onclick="batchSubmit()">上传</button></div>
  </div>
</div>.modal.w600 { width: 600px; margin-left: -300px; }

1. 文件上传框(原生)

原生上传框

将原生上传框隐藏显示,style="display:none"

2. 只显示特定的文件

如何文件上传时只显示某种格式的文件——accept属性列表

在<input type="file" accept="xxx">中设置accept属性。

3. input-group输入框组

将Input标签和icon图标整合在一起。

4. click事件和change事件

上面说到,我们将<input type="file">隐藏后,如何操作它?

  • 使用onclick="$('input[id=batchWithdrawFile]').click();"事件,点击后其实掉起的是<input type="file">
  • 选择文件后,如何将选择后的文件显示在<input type="text"/>上呢?使用 onchange="$('#batchFilename').val($(this).val());"写入。
显示效果

2. Ajax交互

使用FormData实现文件的上传。使用FormData在构造对象的时候,把表单的对象作为一个参数放进去,就可以了。然后FormData,就会得到这个表单对象里面的所有的参数,甚至我们在表单中,都不需要声明enctype ="multipart/form-data" ,就可以直接提交。

通过jQuery Ajax使用FormData对象上传文件

使用ajax提交form表单,包括ajax文件上传

2.1 获取上传文件名

<input type="file"  id="batchFile">

var fileName = new String($('#batchFile').val());

2.2. 获取上传的文件流

2.2.1 若是HTML代码中采用form表单,并指定enctype="multipart/form-data"时

1. HTML代码:

<form id="uploadForm" enctype="multipart/form-data">
    <input id="file" type="file" name="file"/>
    <button id="upload" type="button">upload</button>
</form>

2. js代码:

$.ajax({
    url: '/upload',
    type: 'POST',
    data: new FormData($('#uploadForm')[0]),
    processData: false,
    contentType: false
})

3. 需要注意的几点:

  • processData设置为false。因为data值是FormData对象,不需要对数据做处理。
  • <form>标签添加enctype="multipart/form-data"属性。
  • contentType设置为false。因为是由<form>表单构造的FormData对象,且已经声明了属性enctype="multipart/form-data",所以这里设置为false。
  • 上传后,服务器端代码需要使用从查询参数名为file获取文件输入流对象,因为<input>中声明的是name="file"

2.2.2 若是没有form表单以及enctype="multipart/form-data"属性

1. HTML代码:

<div id="uploadForm">
    <input id="file" type="file"/>
    <button id="upload" type="button">upload</button>
</div> 

2. js代码:

var formData = new FormData();
formData.append('file', $('#file')[0].files[0]);
$.ajax({
    url: '/upload',
    type: 'POST',
    data: formData,
    processData: false,
    contentType: false
})

3. 需要注意的几点:

  • append()的第二个参数应是文件对象,即$('#file')[0].files[0]
  • contentType也要设置为'false'
  • 从代码$('#file')[0].files[0]中可以看到一个<input type="file">标签能够上传多个文件,只需要在<input type="file">里添加multiple或multiple="multiple"属性。

注意事项:
使用FormData提交的时候,注意表单提交的是Request payload。后台需要特殊处理的。比如在SpringMVC中,可以采用下面的配置。

    <!-- 配置nultipartresolver,注意:id名必须这样写,不然会报错 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 默认编码 -->
        <property name="defaultEncoding" value="utf-8"/>
        <!-- 文件大小最大值 -->
        <property name="maxUploadSize" value="10485760000"/>
        <!-- 内存中的最大值 -->
        <property name="maxInMemorySize" value="40960"/>
    </bean>

2.3 HTTP请求中 request payload 和 formData 区别?

FormData和Payload是浏览器传输给接口的两种格式,这两种方式浏览器是通过Content-Type来进行区分的。如果是application/x-www-form-urlencoded的话,则为formdata方式,如果是application/jsonmultipart/form-data的话,则为request payload的方式。

HTTP请求中 request payload 和 formData 区别?

2.3.1 FormData格式

在servlet中,可以通过request.getParameter(name)的形式来获取FormData表单参数。

<script>
var obj = {
            "merchId": merchId,
            "orderId": orderId,
        };
    $('.btn').click(function() {
      $.ajax({
        url: 'www.example.com',
        type: 'POST',
        dataType: 'json',
        data: obj,
        success: function(d) {
            
        }
      })
    });
  </script>
post提交格式

2.3.2 payload格式

Content-Type: application/json 或者 multipart/form-data格式。

文件上传格式

对于文件上传需要进行特殊处理,即在Spring-mvc.xml配置文件中增加multipartResolver配置。

源码

//批量上传提交
function batchSubmit() {
    var self = $('#batchButton');
    if (self.hasClass("disabled")) return;
    /*获取上传的文件名*/
    var fileName = new String($('#batchFile').val());
    /*文件校验*/
    if (fileName == null || fileName == '') {
        layer.alert("请选择文件!", {icon: 2});
        return;
    }
    if (!fileName.endWith(".xlsx") && !fileName.endWith(".xls")) {
        layer.alert("请选择EXCEL文件!", {icon: 2});
        return;
    }
    /*使用FormData获取上传的文件*/
    var formData = new FormData();
    formData.append("XXX", document.getElementById("batchFile").files[0]);

    $.ajax({
        url: "./batchFile/upload",
        type: "POST",
        data: formData,
        contentType: false,
        processData: false,
        success: function (data) {
            if (data.code == '200') {
                layer.confirm('上传成功!', {
                    btn: ['开始信息校验', '删除原文件']
                }, function () {
                    /*上传到服务器上开始文件校验*/
                    $.ajax({
                        type: "POST",
                        url: "./batchFile/validateFile",
                        data: null,
                        contentType: 'application/json;charset=utf-8', //设置请求头信息
                        dataType: "json",
                        beforeSend: function () {
                            layer.msg("数据校验中。。。", {icon: 1, time: -1, shade: 0.4});
                        },
                        success: (function (json) {
                            /*文件校验成功,返回成功笔数和失败笔数*/
                            if (json.code == 200) {
                                layer.closeAll();
                                var data = json.data;
                                $("#successCount").html(data.success);
                                $("#errorCount").html(data.error);
                                /*提供失败文件下载的功能*/
                                $("#downloadErrorFile").attr("href", "./batchFile/errorDownload?type=ERRORFILE");
                                $('#batchResultModal').modal('show');
                            } else {
                                layer.msg(json.message, {icon: 2, time: 2000, shade: 0.4});
                            }
                        }),
                        error: function (json) {
                            layer.closeAll();
                        }
                    });
                }, function () {
                    layer.alert('删除成功!', {icon: 1});
                });
            } else {
                layer.alert(data.message, {icon: 2});
            }
            layer.closeAll('loading');
            self.removeClass("disabled");
        },
        error: function () {
            layer.closeAll('loading');
            layer.alert("上传失败!", {icon: 2});
            self.removeClass("disabled");
        },
        beforeSend: function () {
            layer.load(2, {shade: 0.4});
            self.addClass("disabled");
        }
    });
}

后台代码:

public String upload(@RequestParam("file") MultipartFile file,
            @RequestParam("desc") String desc, HttpServletRequest request) {
        if (!file.isEmpty()) {
            System.out.println("desc : " + desc);
            try {
            
                System.out.println("path : " + path);
                File destFile = new File("file/" + file.getOriginalFilename());
                System.out.println(" 真实路径 : " + destFile.getAbsolutePath());
                
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                throw new MyUserException();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容