springMVC跨服务器上传文件及注意事项
1.导入开发需要的jar包
<properties>
<project.build.sourceEncoding>UTF-</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<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>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</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>
1.1.其中跨服务所需要增加的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>
- 配置前端核心控制器和解决post请求中文乱码问题(需要注意的是springMVCget请求中文不乱码),classpath:springmvc.xml下面会给出。
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--配置前端控制器-->
<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>
<!--配置解决中文乱码的过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
springmvc.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解扫描 -->
<context:component-scan base-package="cn"/>
<!-- 视图解析器对象 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--配置文件解析器 id值是固定的,必须是这样值,否则出错-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--配置最大上传文件的大小-->
<property name="maxUploadSize" value="10485760"></property>
</bean>
<!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven />
</beans>
3.前端界面,提交的是表单,提交的方式必须是post, enctype的必须是:“multipart/form-data”,而且需要注意的是,name的值必须与后台的 MultipartFile 的变量名一致即指定为“upload”就必须都为upload,稍后将在控制类的提现出来,注意留意观察
<form action="file/fileupload3" method="post" enctype="multipart/form-data">
选择文件: <input type="file" name="upload"><br/>
<input type="submit" value="上传">
</form>
上传文件的控制类:这里还解决了上传是带中文的问题和文件重名问题
@Controller
@RequestMapping("/file")
public class fileUpload {
/**
* 跨服务器上传图片,MultipartFile的变量名 必须与表单传来的name值属性相同
* @param upload
* @return
* @throws IOException
*/
@RequestMapping("/fileupload3")
public String fileupload3(MultipartFile upload) throws IOException {
System.out.println("跨服务器的上传文件---");
//定义服务器上传路径(如果没有uploads文件夹需要在另一个服务器中target目录(即编译好的目录)瞎下手动创建uploads文件夹
String path = "http://localhost:9090/uploads/";
//获取文件的名称
String name = upload.getOriginalFilename();
//对带有中文路径名称的图片进行编码
String encodeName = URLEncoder.encode(name, "UTF-8");
//调试带有中文名称的图片是否进行了编码
System.out.println(encodeName);
//防止文件名重名
String uuid = UUID.randomUUID().toString().replace("-", "");
String fileName = encodeName+"_"+uuid;
System.out.println(fileName);
//创建客服端
Client client = Client.create();
//与图片服务器进行连接
WebResource webReource = client.resource(path+fileName);
//上传文件,
webReource.put(upload.getBytes());
return "success";
}
另外需要再创建一个空的项目作为文件服务器,配置服务器时,端口号,必须与以上项目的端口号不一致,需要注意的是,项目部署的方式必须为war exploded方式,不是选择war方式,这两种方式的区别在于:
war: 上传的文件会存放在 Tomcat 所在的目录下
war exploded: 上传的文件会存放在当前目录下
所以部署这个空的项目时需要用war exploed这种方式
4.注意事项:
4.1 上传文件时时出现403错误:
解决办法:tomcat服务器默认是不可写操作,只允许读,所以在Tomcat web.xml文件中的servlet标签内加入readonly:false
<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>readonly</param-name>
<param-value>false</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>
4.2 上传文件时出现409错误:
409路径错误,即当前访问的路径下没有相关文件。
解决办法:在文件存储服务器中的**target/**项目名的路径下,新建一个和你上传服务器路径一致的文件,这里是uploads文件。