Springmvc实现文件上传
pom.xml中引入jar包
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<!--锁定spring的版本-->
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- 引入 JSON解析器-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<!--上传文件所需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>
<!-- 跨服务器上传 -->
<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>
</dependencies>
前台页面
<%--文件上传enctype类型要修改为multipart/form-data 提交方式必须为post--%>
<form action="${pageContext.request.contextPath}/upload/uploadfile" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload" /><br />
<%--这里的name要和后台调用的name相同--%>
<input type="submit" value="上传文件" />
</form>
Springmvc.xml的配置
<!--开启组件的注解扫描-->
<context:component-scan base-package="org.westos"/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
<!--prefix 前缀 suffix 后缀 拼完成就是 /WEB-INF/success.jsp 因为我们返回的是一个success这个字符,然后再拼接上我们配置的前缀和后缀,就可以跳转到success.jsp这个页面-->
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--配置静态资源不被拦截-->
<mvc:default-servlet-handler/>
<!--配置文件解析器的对象,要求id名称必须是multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 限制上传文件的大小 单位是kb -->
<property name="maxUploadSize" value="#{1024*1024*100}"/>
</bean>
<!--开启springmvc的注解驱动-->
<mvc:annotation-driven/>
web.xml的配置
<!--配置springMVC的核心控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
后台代码的编写
@Controller
@RequestMapping("/upload")
public class uploadController {
@RequestMapping("/uploadfile")
public String uploadFile2(HttpServletRequest request, MultipartFile upload) throws Exception {
//获取服务器的真实路径
String filePath = request.getSession().getServletContext().getRealPath("/upload");
System.out.println(filePath);
//判断该服务器端的uploads是否存在,不存在就创建
File file = new File(filePath);
if (!file.exists()) {
file.mkdirs();
}
//1.获取上传的文件名称
String filename = upload.getOriginalFilename();
//2.上传文件
upload.transferTo(new File(file,filename));
return "sucess";
}
}
SpringMVC跨服务器方式文件上传
在实际开发中,我们会有很多处理不同功能的服务器。例如:
应用服务器:负责部署我们的应用
数据库服务器:运行我们的数据库
缓存和消息服务器:负责处理大并发访问的缓存和消息
文件服务器:负责存储用户上传文件的服务器。
这个项目不需要编写任何代码,他是充当一个文件服务器 比如我们项目名是 fileupload_server
在应用服务器上,实现SpringMVC跨服务器方式文件上传,需要引入下面两个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>
通过注释可以看到默认情况下当我们进行put或者delete操作的时候,服务器是拒绝访问的,所以想向服务器上传文件必须将readonly
属性设置为false
。
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<!-- 添加,解决jersey上传服务器403错误 -->
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<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>
<load-on-startup>1</load-on-startup>
</servlet>
编写后台代码:
@Controller
@RequestMapping("/upload")
public class UploadController{
@RequestMapping("/uploadfile")
public String uploadFile3(MultipartFile upload) throws Exception {
// 1.定义图片服务器的请求路径
String path = "http://localhost:9090/fileupload_server/uploads/";
// 2.获取到上传文件的名称
String filename = upload.getOriginalFilename();
System.out.println(filename);
//3.向文件服务器,上传文件
//3.1 创建客户端
Client client = Client.create();
//3.2 连接图片服务器
WebResource resource = client.resource(path + filename);
//3.3 上传文件 注意文件名不要含有中文,否则报错
resource.put(upload.getBytes());
return "success";
}
}
需要我们在图片服务器的fileupload_server项目中的target/fileupload_serve下自己创建一个uploads 目录
如果我们不配置项目路径,那么图片
String path = "http://localhost:9090/uploads/"; 也就是没有配置项目路径
那么图片就上传在tomcat服务器的Root文件夹下