文件上传的必要前提:
- form表单的enctype取值必须是:multipart/form-data。默认是:application/x-www-form-urlencoded。enctype:是表单请求正文的类型。
- method属性取值必须是post。
- 提供一个文件选择域<input type="file"/>
借助第三方组件实现文件上传
使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑。
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
SpringMVC 传统方式的文件上传
说明:传统方式的文件上传,指的是上传的文件和访问的应用存在于同一个服务器上,并且上传完成之后,浏览器可以跳转。
实现步骤:
第一步:导入commons-fileupload依赖
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
第二步:编写jsp页面
<form enctype="multipart/form-data" method="post" action="${pageContext.request.contextPath}/fileUpload"> 名称:<input type="text" name="picName"/> <%--file元素的name必须和Controller中方法中参数名保持一致--%> 图片:<input type="file" name="uploadFile"/> <input type="submit" value="上传"/> </form>
第三步:编写控制器
@Controller("fileUploadController")
public class FileLoadController {
@RequestMapping("/fileUpload")
public String fileUpload(Model model, MultipartFile uploadFile,String picName,HttpServletRequest request) throws IOException {
//定义文件名
String fileName = "";
//获取原始文件名
String uploadFileName = uploadFile.getOriginalFilename();
//获取文件扩展名
String extendName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1, uploadFileName.length());
//把文件名上加上随机数,防止文件重复
String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
//判断文件名是否重复
if (!StringUtils.isEmpty(picName)) {
fileName = uuid + "_" + picName + "." + extendName;
} else {
fileName = uuid + "_" + uploadFileName;
}
//获取文件路径
ServletContext context =request.getSession().getServletContext();
String basePath = context.getRealPath("/uploads");
//以日期命名目录,用以解决同一个文件夹过多问题
String datePath = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
//判断路径是否存在
File file = new File(basePath + "/" + datePath);
if (!file.exists()) {
file.mkdirs();
}
//使用MultipartFile接口中方法,把上传的文件写到指定位置
uploadFile.transferTo(new File(file,fileName));
model.addAttribute("message", "上传成功");
return "success";
}
}
第四步:配置文件服务器
<!--配置文件上传解析器 其中bean的id是固定不变的 "multipartResolver"--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--设置文件上传的最大大小--> <property name="maxUploadSize"> <value>5242880</value> </property> </bean>
注意:文件上传的解析器id是固定不变的,不能起别的名称,否则无法实现请求参数的绑定。(不仅是文件,其他字段也无法绑定)
springmvc跨服务器方式的文件上传
分服务器的目的
在实际开发中,需要不同功能的服务器。
- 应用服务器:负责部署系统应用
- 数据库服务器:运行系统的数据库
- 缓存和消息服务器:负责处理大并发访问的缓存和消息
- 文件服务器:负责存储用户上传文件的服务器
分服务器处理的目的是让服务器各司其职,从而提高项目的运行效率。

第一步:添加依赖
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>1.18.1</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.18.1</version> </dependency>
第二步:编写jsp页面
<form method="post" action="${pageContext.request.contextPath}/fileUpload" enctype="multipart/form-data"> <input type="text" name="picName"/><br> <input type="file" name="picfile"/><br> <input type="submit" value="上传"/> </form>
第三步:编写控制器
@Controller public class FileController { //另一台服务器的文件目录 private final String FILESERVERURL="http://localhost:8080/SpringMVC01_war/uploads/"; @RequestMapping("/fileUpload") public String fileUpload(Model model, MultipartFile picfile,String picName) throws IOException { String fileName=""; //获取原始文件的文件名 String uploadFileName=picfile.getOriginalFilename(); //获取文件的扩展名 String extendName=uploadFileName.substring(uploadFileName.lastIndexOf(".")+1,uploadFileName.length()); //在文件上添加随机数,确保不重复 String uuid= UUID.randomUUID().toString().replace("-","").toUpperCase(); //判断是否输入了文件名 if (!StringUtils.isEmpty(picName)) { fileName = uuid + "_" + picName + "." + extendName; } else { fileName = uuid + "_" + uploadFileName; } //创建客户端对象 Client client = Client.create(); //与服务器进行连接 WebResource resource = client.resource(FILESERVERURL + fileName); //进行文件上传,并将文件转换成字节流 String result = resource.put(String.class, picfile.getBytes()); System.out.println(result); model.addAttribute("message","上传成功"); return "success"; } }
第四步:配置解析器
<!--配置文件上传解析器 其中bean的id是固定不变的 "multipartResolver"--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--设置文件上传的最大大小--> <property name="maxUploadSize"> <value>5242880</value> </property> </bean>
第五步:设置目标服务器tomcat的配置文件。conf目录下web.xml中<Servlet></Servlet>里面添加,否则就会报错405 Method Not Allowed。
<init-param> <param-name>readonly</param-name> <param-value>false</param-value> </init-param>
posted on
浙公网安备 33010602011771号