使用文件上传功能我们要借助form表单,固定设置:
表单中的请求方式一定是post、参数enctype是:multipart/form-data
还需要借助两个依赖:commons-fileupload、commons-io
一、实现本地上传
引入依赖:
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- commons-fileupload依赖于commons-io,会自动导入commons-io-->
spring-mvc.xml文件中配置上传解析器,也可以设置一些相关参数(比如上传文件的最大大小···)
<context:component-scan base-package="com.bdit.controller"/>
<!-- 配置文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大大小-->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
准备Controller
@Controller
public class FileUploadController {
@RequestMapping("/upload")
@ResponseBody
public String upload(MultipartFile multipartFile, HttpServletRequest request){
//准备一个随机生成的文件名
String uuid = UUID.randomUUID().toString();
//获取上传过来的资源的文件名
String fileName = multipartFile.getOriginalFilename();
//准备上传资源的保存路径(该文件夹不能为空,为空就不会被编译)
String savePath = request.getServletContext().getRealPath("/upload/");
System.out.println(savePath);
//准备一个File对象,将保存路径和名字给它
File file = new File(savePath,uuid+fileName);
try {
//实现上传
multipartFile.transferTo(file);
} catch (IOException e) {
e.printStackTrace();
}
return "ok!";
}
}
我们使用到了MultipartFile对象中的两个方法:
1、 getOriginalFilename()获得上传文件的原名
2、 transferTo(file)将上传文件保存到一个文件路径中去
准备前端页面
<form action="upload" enctype="multipart/form-data" method="post">
<!-- 注意:这里的name一定要和upload方法中传的参数名相同-->
<input type="file" name="multipartFile">
<input type="submit" value="提交">
</form>
启动项目,在页面上提交文件,从项目的target目录下就可以找到的我们上传的文件
二、实现跨服上传
和保存在本地不同,现在我们需要两个服务器,一个用来处理请求,另一个作为文件服务器,保存我们上传的文件
引入依赖:
<!-- 跨服上传-->
<!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-core -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.19.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-client -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19.4</version>
</dependency>
</dependencies>
为Controller再添加一个跨服上传的方法:
@RequestMapping("/upload2")
@ResponseBody
public String upload2(MultipartFile multipartFile){
String uuid = UUID.randomUUID().toString();
String fileName = multipartFile.getOriginalFilename();
//获取后缀名
fileName = fileName.substring(fileName.lastIndexOf("."));
//准备保存文件的服务器地址
String serverUrl = "http://localhost:8081/springmvc_day03_uploadhouse/upload/";
//创建一个客户端对象
Client client = Client.create();
//客户端与文件服务器连接
WebResource resource = client.resource(serverUrl+uuid+fileName);
try {
resource.put(String.class,multipartFile.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
return "ok!";
}
修改form表单提交地址
<form action="upload2" enctype="multipart/form-data" method="post">
<input type="file" name="multipartFile">
<input type="submit" value="提交">
</form>
这个时候我们就需要准备另一个web服务器,作为文件服务器
准备第二个tomcat,这时候需要修改第二个tomcat的端口号,conf目录下server.xml文件中修改为8081:
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
tomcat默认是不支持跨服上传的,添加配置:conf目录下web.xml文件DefaultServlet的servlet标签中添加:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<!-- 添加的内容**********************-->
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<!-- *******************************-->
<load-on-startup>1</load-on-startup>
</servlet>
现在第二个tomcat已经准备好了,只需要我们使用IDEA将项目配置到这个服务器上就可以了
这个用来保存我们文件的服务器不需要写任何东西,准备一个保存文件的地址即可(里面放上一个文件,因为为空不会被编译)
启动项目,输入http://localhost:8081/springmvc_day03_uploadhouse/upload/a.txt可以直接访问的到我们的a.txt就行,文件服务器就准备完毕了。
启动主项目服务器,上传文件,成功后查看文件服务器target目录: