springmvc文件上传
1. 文件上传前提
- 修改form的默认提交方式
- 请求方式必须是post
- input 的type必须是file
分析:form默认的请求体为键值对,修改后请求体将分割为不同部分,包含上传文件信息。
- 借助第三方组件,解析上传的文件信息。
1 commons-fileupload
2 commons-io
2. 实现功能
- jsp页面
<form action="/fileUpload" method="post" enctype="multipart/form-data">
名称:<input type="text" name="picname"/><br/>
图片:<input type="file" name="uploadFile"/><br/>
<input type="submit" value="上传"/>
</form>
- controller
① 首先获取文件的上传位置,文件要放在那里
拿到项目根目录,如何拿到项目根目录request.getSession().getServletContext().getRealPath("/uploads/");
② 创建File对象去操作文件或文件夹,判断路径是否存在,不存在就使用file.mkdirs去创建,如何判断file.exists().
③ controller需要接收request,用来获取上传的文件。
④ 使用第三方工具解析request,这套东西包含三个对象(DiskFileItemFactory、ServletFileUpload、FileItem)
⑤ 创建DiskFileItemFactory
⑥ 利用factory去创建ServletFileUpload
⑦ upload.paresRequest(request)去解析request,得到FileItem集合
⑧ 遍历该集合,判断是否是form上传,item.isFromField()这个方法是判断是不是普通表单项目,否在就是上传文件项。
⑨上传文件项,item就是我们上传的文件,获取文件名,使用uuid对文件名命名。
⑩uuid的写法
String uuid = UUID.randomUUID().toString().replace("-","");
对文件名进行拼接。
使用item.write(new File(path,filename));
将文件写入到路径中。
使用item.delete(),清除临时文件。
2. springmvc上传文件
原理:
上传文件,主要是解析request,获得上传文件项,完成上传,我们上面从⑦ upload.paresRequest(request)获取FileItem,就是获取上传文件项,然后调用item.write(new File(path,filename)),完成上传。
springmvc帮我们获取上传文件项,我们需要配置文件解析器,然后在controller方法参数中使用MultipartFile去接收上传文件项,调用方法完成生产即可。
注意:input 中的name属性的名称,必须与controller方法参数MultipartFile名称相同。
2.1配置文件解析器
导入jar
<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>
- id:multipartResolver 这个名称不能改
- class:CommonsMultipartResolver
bean.xml
<bean id="multipartResolver" <!-- id 的值是固定的-->
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为 5MB --> <property name="maxUploadSize"> <value>5242880</value>
</property>
</bean>
- controller中
①获取地址,这个地址本案例中使用的是,项目根目录下的地址
request.getSession().getServletContext().getRealPath("/uploads/");
得到地址后判断是否存在,如果不存在就创建。
②文件名称的问题,先获取文件名称
upload.getOriginalFilename(),在使用uuid去唯一化名称。
③使用upload.transferTo(new File(path,filename))完成上传。
@RequestMapping(value = "/upload02.do")
public String upload02(HttpServletRequest request, MultipartFile upload)throws Exception{
String path = request.getSession().getServletContext().getRealPath("/upload/");
File file = new File(path);
if (!file.exists()){
file.mkdirs();
}
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid +"_"+ filename;
upload.transferTo(new File(path,filename));
return "success";
}
jsp
<form action="${pageContext.request.contextPath.toString()}/user/upload02.do" method="post" enctype="multipart/form-data">
<input type="file" name="upload"/>
<input type="submit" value="上传文件">
</form>
3. 跨服上传文件
使用的jar
<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>
- srpingmvc的方式去获取文件上传项
配置CommonsMultipartResolver的bean,id为multipartResolver,controller方法中使用MultipartFile对象去获取文件上传项,input的name属性名称必须与MultipartFile 对象的名称相同。 - 拿到文件上传项就可以使用jersey实现跨服上传。
需要一个路径,和一个文件名称
先创建对象,
Client client = Client.create();
设置路径和文件的名称(localhost:8888/…文件名称.jsp)
WebResource webResource = client.resource(path+filename);
上传文件 ,把文件上传项的字节数组传递过去。
webResource.put(upload.getBytes());