现在回过头来仔细想想SpringMvc上传文件,真是很方便
下面我就简单的理一下整个过程吧
使用SpringMVC上传文件需要用到这两个jar包,文章结尾提供了免费的下载:
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
首先需要在配置文件中配置 multipartResolver 上传文件解析器
可不用配置什么文件大小什么的,这个可以在前台进行处理,为了减轻服务器压力
<!-- 配置上传文件 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="UTF-8" /> </bean>
接着,一个简单的提交页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script type="text/javascript" src="js/public/jquery-1.11.3.js"></script> <script type="text/javascript"> function filesize() { var fileInput = $("#fileid")[0]; byteSize = (fileInput.files[0].size / 1024).toFixed(2); alert(byteSize); } function upload() { var formData = new FormData($( "#formid" )[0]); $.ajax({ url: "upload/file1.do" , type: "POST", data: formData, async: false, cache: false, contentType: false, processData: false, success: function (returndata) { alert(returndata); }, error: function (returndata) { alert(returndata); } }); } </script> <title>上传文件</title> </head> <body> <form id="formid"> 文件:<input type="file" id="fileid" name="filename" onchange="filesize();" /><br /> 姓名:<input type="text" id="userid" name="username" /> 密码:<input type="text" id="password" name="password" /> <input type="button" id="buttonid" value="上传" onclick="upload();" /> </form> </body> </html>
关于FormData 的一些简要说明,可以参考这里 :
SSH框架中struts2上传文件的实现,页面不跳转刷新,使用FormData进行Ajax请求
上面的代码中,当我们选择文件时,会执行一个filesize这个jquery方法,它会为我们计算当前这个文件的大小,并精确到小数点后两位,单位是KB。这样,我们就可以客户端验证文件大小,而不必在服务端去验证了。
最后是我们的控制器Controller
package com.springmvc.study.upload; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Date; import java.util.Iterator; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.commons.CommonsMultipartFile; import org.springframework.web.multipart.commons.CommonsMultipartResolver; import com.springmvc.study.json.listuser; @Controller @RequestMapping("/upload") public class UpLoad { @RequestMapping("/file1") public @ResponseBody String getFile1(listuser users, HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException{ System.out.println(request.getParameter("username")); System.out.println(users.getUsername()); //使用springmvc提供的方法来处理文件 //初始化解析器 CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); //判断request中是否有multipartResolver类型数据,有就表示有文件类型 if(multipartResolver.isMultipart(request)){ MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; //获得文件名,这里是迭代器封装 Iterator iter = multiRequest.getFileNames(); while(iter.hasNext()){ //这是前台name字段的名字,比如这里是filename String filename = (String) iter.next(); //根据name字段来获得MultipartFile MultipartFile file = multiRequest.getFile(filename); //如果file不为空,就表示是一个MultipartFile文件 //这里可不判断,因为上面已经判断了有文件类型 if(file != null){ String fileName = new Date().getTime()+file.getOriginalFilename(); String path ="d:\\"+fileName; File localFile = new File(path); //Springmvc 提供的写文件方法 file.transferTo(localFile); } } } return "123"; } }上面的代码,我已写了大概注释,
其中需要注意的是这两行代码
System.out.println(request.getParameter("username"));
System.out.println(users.getUsername());
request是前台发送过来的数据,所以里面有我们的表单参数 username 这是可以理解的
而方法里面的 listuser users 以及下面的那句打印语句是怎么回事呢
首先这里的listuser是一个普通的javabean 在我的上一篇文章已提到 SpringMVC与前台JSON数据相互交互的三种实现方式 完整实例DEMO
就是SpringMVC会自动将表单中的username和password注入到listuser中
所以我们的打印语句是正确的。
而余下的代码则主要是处理文件数据。
上传文件jar包下载 commons-fileupload-1.3.1.jar commons-io-2.2.jar
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情