传统JavaWeb的文件上传
1.前提
1.1form 表单的 enctype 取值必须是:multipart/form-data(用分隔符将表单分为几个部分,其中有表单元素的名称,也有你选择的文件)
(默认值是:application/x-www-form-urlencoded,它设置了将表单数据以键值对的形式上传)
enctype:是表单请求正文的类型
1.2 method 属性取值必须是 Post
1.3 提供一个文件选择域<input type=”file” />
2.文件上传原理
当 form 表单的 enctype 取值不是默认值后,request.getParameter()将失效。 enctype=”application/x-www-form-urlencoded”时,form 表单的正文内容是:
key=value&key=value&key=value
当 form 表单的 enctype 取值为 Mutilpart/form-data 时,请求正文内容就变成:
每一部分都是 MIME 类型描述的正文
-----------------------------7de1a433602ac 分界符
Content-Disposition: form-data; name="userName" 协议头
aaa 协议的正文
-----------------------------7de1a433602ac
Content-Disposition: form-data; name="file";
filename="C:\Users\zhy\Desktop\fileupload_demofile\b.txt"
Content-Type: text/plain 协议的类型(MIME 类型)
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-----------------------------7de1a433602ac--
这时需要先解析表单传输的数据体,找到表单上传的文件的部分,才能进行上传。
借助jar包可以方便解析
3.借助第三方组件实现文件上传
使用 Commons-fileupload 组件实现文件上传,需要导入该组件相应的支撑 jar 包:Commons-fileupload 和commons-io。commons-io 不属于文件上传组件的开发 jar 文件,但Commons-fileupload 组件从 1.1 版本开始,它工作时需要 commons-io 包的支持
导入依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency> <dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
SpringMVC的文件上传
与传统文件上传的区别在于,SpringMVC框架能够代替我们去解析request,拿到需要上传的文件。为使用该功能只需要引入SpringMVC已经创建好的一个用于解析request的类:CommonsMultipartResolver
1.编写用于上传文件的jsp页面
<h3>SpringMVC方式上传</h3>
<form name="upload" action="work/upload2" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"/><br>
<input type="submit" value="上传"/>
</form>
2.在springmvc.xml中配置CommonsMultipartResolver:
<!--id名必须是multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"></property> <!--规定上传文件的大小,单位是字节,10M=10*1024*1024=10485760-->
</bean>
3.编写Controller方法
@RequestMapping("/upload2")
public String upload2(HttpServletRequest request, MultipartFile upload) throws IOException { /*MultipartFile创建的对象的名字必须和上传文件页面选择文件的组件名相同*/
//1.拿到上传文件的文件夹地址
String path=request.getSession().getServletContext().getRealPath("/uploads/");
//判断该文件夹是否存在,如果不存在,创建新的文件夹
File file=new File(path);
if(!file.exists()){
file.mkdirs();
}
//upload是解析完request后得到的需要上传的文件,上传该文件
String fileName=UUID.randomUUID().toString().replace("-"," ")+"_"+upload.getOriginalFilename();
upload.transferTo(new File(path,fileName));
return "success";
}
注意的地方:
1.引入解析request的CommonsMultipartResolver类时,id名必须是multipartResolver
2.通过参数绑定机制拿到解析后的上传文件,需要在Controller方法的参数中添加MultipartFile的一个实例,且名字必须和jsp页面的上传文件的组件名相同
3.在Controller方法方法中获取上传文件的名称的方法是upload.getOriginalFilename()而不是upload.getName();
SpringMVC的跨服务器文件上传
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。