基于SSM框架的使用MultipartFile实现单个文件或多个文件的上传/下··

MultipartFile是在web中对文件上传的一个组件,关于怎么使用,在这里做一个简单的demo

                                                                                                                                        —— @Yelihu 2018年9月20日 00:36:21

 *若非特殊说明,本博客所有项目都由Intellij IDEA开发,(或者相同公司的产品)

1.在maven中,首先导入apache commons uploadfile的包。在respository中搜索uploadfile即可,选择1.31或者1.33版本的随意,复制粘贴在pom.xml,若不是maven项目,则需要下载添加相应的jar包

2.注册文件上传解析器,在spring的配置文件里面(属性的作用如注解标识)

<!--springMVC文件上传解析器-->
	<bean id="exceptionResolver" class="com.fh.resolver.MyExceptionResolver"></bean>
	<!--id必须是exceptionResolver这个名字,源代码中已经写死-->
	<!-- 上传拦截,如最大上传值及最小上传值 -->
	  <bean id="multipartResolver"   class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >   
		  <!--定义上传的最大大小,单位为byte-->
		  <property name="maxUploadSize">
	          <value>104857600</value>    
	       </property>   
	        <property name="maxInMemorySize">    
	            <value>4096</value>    
	        </property>
		  <!--指定上传的默认编码-->
	         <property name="defaultEncoding">    
	            <value>utf-8</value>    
	        </property> 
    </bean>  

ps.属性补充:

3.前端代码文件提交部分:*注意:由于上传所遵循的传输协议要求特殊,所以要在前端提交表单的时候添加一个属性 enctype即encoding type 文件上传的内容在正文,必须使用POST请求而不是GET

               <form action="/plan/uploadtest" method="post" class="form-horizontal" role="form" enctype="multipart/form-data">
                            <div class="col-md-12">
                                <div class="form-group">
                                    <label class="col-sm-3 control-label no-padding-right">文件域:</label>
                                    <div class="col-sm-9">
                                        <input type="file" id="tp" name="file" />
                                    </div>
                                    <br>
                                    <input type="submit" value="点击上传">
                                </div>
                            </div>
                        </form>

4.controller部分代码,获取文件和文件名称,对文件名称进行处理(添加时间戳防止重名)之后,保存在本机的E盘下,结束并跳转到成功页面 upload_success.jsp并打印成功信息

/**
     * 上传文件
    
     * */
    @RequestMapping(value="/uploadtest")
    public String uploadtest(@RequestParam("file")MultipartFile multipartFile, Model model){//入参代表上传的文件

            //0,判断是否为空
        if(multipartFile!=null && !multipartFile.isEmpty())
        {

            /**
             * 对文件名进行操作防止文件重名
             */

            //1,获取原始文件名
            String originalFilename = multipartFile.getOriginalFilename();
            //2,截取源文件的文件名前缀,不带后缀
            String fileNamePrefix = originalFilename.substring(0,originalFilename.lastIndexOf("."));
            //3,加工处理文件名,原文件加上时间戳
            String newFileNamePrefix  = fileNamePrefix + System.currentTimeMillis();
            //4,得到新文件名
            String newFileName = newFileNamePrefix + originalFilename.substring(originalFilename.lastIndexOf("."));


            //5,构建文件对象
            File file = new File(upLoadPath + newFileName);
            //6,执行上传操作
            try {
                multipartFile.transferTo(file);
                //上传成功,向jsp页面发送成功信息
                model.addAttribute("fileName","文件上传成功!  文件名:"+newFileName);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

       return "system/plansubmit/upload_success";
    }

如上,已经完成了对单个文件上传的操作,控制台已经能打印出文件的名称(处理后)并保存文件到指定的E盘根目录下

对于多个文件,只需要修改前端代码(多个文件input)+controller 即可。

JSP页面:

<form action="/plan/uploadtest2" method="post" class="form-horizontal" role="form" enctype="multipart/form-data">
                            <div class="col-md-12">
                                <div class="form-group">
                                    <label class="col-sm-3 control-label no-padding-right">文件域:</label>
                                    <div class="col-sm-9">
                                        <input type="file"  name="file" />
                                        <input type="file"  name="file" />
                                    </div>
                                    <br>
                                    <input type="submit" value="点击上传">
                                </div>
                            </div>
                        </form>

即多个name为file的input,不需要给多个name命名,后台使用Multipart[] 这个数组接收即可

Controller代码如下:

@RequestMapping(value="/uploadtest2")
    public String uploadtest2(@RequestParam("file")MultipartFile[] multipartFiles,Model model){//入参代表上传的文件

        //设置list存放数组
        List<String> fileNames = new ArrayList<>();

        //0,判断是否为空
        if(multipartFiles!=null && multipartFiles.length>0)
        {
            for (MultipartFile multipartFile:multipartFiles)
            {
                if(multipartFile!=null && !multipartFile.isEmpty())
                {

                    /**
                     * 对文件名进行操作防止文件重名
                     */

                    //1,获取原始文件名
                    String originalFilename = multipartFile.getOriginalFilename();
                    //2,截取源文件的文件名前缀,不带后缀
                    String fileNamePrefix = originalFilename.substring(0,originalFilename.lastIndexOf("."));
                    //3,加工处理文件名,原文件加上时间戳
                    String newFileNamePrefix  = fileNamePrefix + System.currentTimeMillis();
                    //4,得到新文件名
                    String newFileName = newFileNamePrefix + originalFilename.substring(originalFilename.lastIndexOf("."));


                    //5,构建文件对象
                    File file = new File(upLoadPath + newFileName);
                    //6,执行上传操作
                    try {
                        multipartFile.transferTo(file);
                        //上传成功,把 文件名 存入list里面
                        fileNames.add(newFileName);

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
        }

        //list传送到前端
        model.addAttribute("fileNames",fileNames);

        return "system/plansubmit/upload2_success";
    }

设置List存放多个文件的名字,循环内部对每个文件进行文件名处理并输出

如上,已经完成了对多个文件上传的操作,文件已经保存到到指定的E盘根目录下。

猜你喜欢

转载自blog.csdn.net/Xenoverse/article/details/82780438
今日推荐