zoukankan      html  css  js  c++  java
  • Java Web使用Html5 FormData实现多文件上传

    前一阵子,迭代一个线上的项目,其中有一个图片上传的功能,之前用的ajaxfileupload.js来实现上传的,不过由于ajaxfileupload.js,默认是单文件上传(虽然可以通过修改源码的方法来实现多文件上传),又加上是在移动端做的,所以就打算采用html5的FormData实现多文件上传

    首先html页面定义有两种:

    Html1

    <form enctype="multipart/form-data" id="formfile">
    <input type="file" name="file"/>
    </>
    

    Html2

    <input  type="file" multiple="multiple"  accept="image/gif, image/jpeg, image/png, image/jpg, image/bmp" />
    

     项目中我采用了Html2的方式

    再看看上传的JS部分吧:

     1  $(document).on("change", ".upload-img input:file", function() {
     2 
     3         var fileId = $(this).attr("id");
     4         var t_files = this.files;
     5         var imglength =  $("#view_" + fileId).parent().parent().find(".upload-img").length;
     6 
     7         if (imglength==1) {
     8             if (t_files.length > 5) {
     9                 new Message().showMsg("最多选择五张图片");
    10                 return false;
    11             } else if (t_files.length < 1) {
    12                 new Message().showMsg("至少选择一张图片");
    13                 return false;
    14             }
    15         }else if(t_files.length+imglength>6) {
    16             new Message().showMsg('最多再选择'+ (6-parseInt(imglength)) +'张图片');
    17             return false;
    18         }
    19         var data = new FormData();
    20         for (var i=0;i<t_files.length;i++){
    21             data.append('file',t_files[i]);
    22             data.append('randomCode',fileId+i);
    23             data.append('upDir','comment')
    24         }
    25 //        for(var pair of  data.entries()){
    26 //            console.log(pair);
    27 //        }
    28 //        console.log(JSON.stringify(data));
    29         $.ajax({
    30             url : '${pageContext.request.contextPath}/file/multipleCommentImageUpload', //用于文件上传的服务器端请求地址
    31             type : 'post',
    32             processData: false, // 告诉jQuery不要去处理发送的数据
    33             contentType: false, // 告诉jQuery不要去设置Content-Type请求头
    34             data:data,
    35             cache: false
    36         }).done(function(data,status){
    37             var dataObj = jQuery.parseJSON(data);
    38             if(dataObj.state == -1){
    39                 new Message().showMsg("上传图片出错");
    40             }else{
    41                 var imgs = dataObj.imgs;
    42                 for (var i=0;i<imgs.length;i++) {
    43                     var imgUrl = imgs[i].imageUrl;
    44                     var imglength = $("#view_" + fileId).parent().parent().find(".upload-img").length
    45                     if ( imglength < 5) {
    46                         $("#view_" + fileId).parent().after('<div class="upload-img"><img src="' + imgUrl + '" alt="" class="upload_left" rotation-num="0"/></div>');
    47                         $("#view_" + fileId).parent().nextAll().find('span').eq(0).text(parseInt($("#view_" + fileId).parent().nextAll().find('span').eq(0).text())+1);
    48                         $("#view_" + fileId).parent().nextAll().find('span').eq(1).text(5-parseInt($("#view_" + fileId).parent().nextAll().find('span').eq(0).text()));
    49                     }else{
    50                         $("#view_" + fileId).attr('src',imgUrl);
    51                         $("#view_" + fileId).nextAll().find('input').hide();
    52                         $("#view_" + fileId).parent().nextAll().remove('p');
    53                     }
    54 
    55                 }
    56             }
    57         }).fail(function (res) {
    58             //console.log("error")
    59         })

    上面第19行代表初始化formdata对象,其有两种创建方法,对于使用html2来说使用该方式来创建,使用html1来说可以使用 var data = new FormData(document.getElementById("#formfile");两种创建方式基本没有区别;第22-23行是可以给formdata添加其他属性的,,按需选择,21行是添加文件必须要写的.ajax部分 32 33行是必须要设置的,网上有说明,我就不多说了;

    Java代码部分:

       public void multipleCommentImageUpload(HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "file", required = false)List<MultipartFile> files) {
            response.setContentType("text/html;charset=utf-8");
            UserSession user = WebUtil.getSessionUser(request);
            for (MultipartFile file:files) {
                String fileName = file.getOriginalFilename(); //获取文件名
            }
            UploadMessage message = new UploadMessage();
            Map map1 = new HashMap();
    
            try {
                Map<String,Object> map = this.multipleUpload(request, files);
               };
        protected Map<String,Object> multipleUpload(HttpServletRequest request, List<MultipartFile> files) throws IllegalStateException, IOException {
    
            Map<String,Object> map =new HashMap();
            for(MultipartFile file:files) {
                if (file == null) {
                    map.put("status",-1);
                    map.put("statusInfo","上传参数不能为空");
                    return map;
                }
            }
    
            //创建一个通用的多部分解析器
            CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
            //判断 request 是否有文件上传,即多部分请求
            if (multipartResolver.isMultipart(request)) {
                //转换成多部分request
                MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
                Enumeration params = multiRequest.getParameterNames();
                String upDir = null;
            //获得formdata对象中自定义的一些属性,是枚举类型
    while (params.hasMoreElements()) { String name = (String)params.nextElement(); upDir = multiRequest.getParameter("upDir"); } //取得request中的所有文件名 Iterator<String> iter = multiRequest.getFileNames(); List<Map> list = new ArrayList<>(); MultiValueMap<String, MultipartFile> multiValueMap = multiRequest.getMultiFileMap(); List<MultipartFile> fileList = multiValueMap.get("file"); for (MultipartFile file:fileList){ //这里上传多张图片 StringBuffer url = new StringBuffer(""); Map<String,String> map1 = new HashMap<>(); if (file != null) { //取得当前上传文件的文件名称 String originalFilename = file.getOriginalFilename(); //如果名称不为“”,说明该文件存在,否则说明该文件不存在 if (originalFilename != null && originalFilename.trim() != "") { String suffix = ""; if (originalFilename.indexOf(".") > -1) { suffix = originalFilename.substring(originalFilename.lastIndexOf("."), originalFilename.length()); } if (notImageFormat(suffix)) { map.put("statusInfo",imageFomat); return map; } if (isPassSize(file.getSize())) { map.put("stateInfo",imageSize); return map; } //重命名上传后的文件名 String fileName = idWorker.nextId() + suffix; String dir = DateTimeUtil.formatDateTime("yy/MM/dd"); if (!StringUtils.isBlank(upDir)){ url.append("/").append( upDir); } url.append("/").append(dir).append("/"); //定义上传路径 String path = ParamUtil.imageServiceRealPath + url; //上传图片 imageUploadService.uploadImage(path, fileName, file.getInputStream()); String allUrl = url + fileName; map1.put("imagePath",url.toString()); map1.put("imageName",fileName); map1.put("imageUrl",ParamUtil.imageServicePath + allUrl); list.add(map1); } } } map.put("status",0); map.put("statusInfo","success"); map.put("imgs",list); } return map; }

    具体上传的代码就需要自己来实现了,总之就是多文件上传后,也还是需要循环着来传的.

    网上有挺多的关于formdata多文件上传的文章,但都写的比较零散,有的只写了前台,有的写得只是后台,有一篇写得比较详细,不过是php的,所以自己就整理了一篇java的,希望可以帮到需要帮助的人

  • 相关阅读:
    Linkerd 2.10(Step by Step)—将 GitOps 与 Linkerd 和 Argo CD 结合使用
    Linkerd 2.10(Step by Step)—多集群通信
    Linkerd 2.10(Step by Step)—使用 Kustomize 自定义 Linkerd 的配置
    Linkerd 2.10(Step by Step)—控制平面调试端点
    Linkerd 2.10(Step by Step)—配置超时
    Linkerd 2.10(Step by Step)—配置重试
    Linkerd 2.10(Step by Step)—配置代理并发
    本地正常运行,线上环境诡异异常原因集合
    Need to invoke method 'xxx' declared on target class 'yyy', but not found in any interface(s) of the exposed proxy type
    alpine 安装常用命令
  • 原文地址:https://www.cnblogs.com/kanyun/p/7159232.html
Copyright © 2011-2022 走看看