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>
2、tomcat默认是开启只读的,上传文件需要先关闭。具体做法:找到tomcat的conf 文件夹下的web.xml 文件,打开,找到<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>
<load-on-startup>1</load-on-startup>
</servlet>
在其中添加如下的初始化参数,将只读关闭
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
3、接下来先看实现代码,再说其中比较坑的地方
index.jsp
<h4>跨服务器上传文件</h4><br>
<form action="user/fileUploadCrossServer" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"><br>
<input type="submit" value="上传">
</form>
注意: ① form表单的method必须为post,必须有enctype='multipart/form-data’属性 ② input标签的type= ‘file’,且必须name属性
FileUploadController.java
@RequestMapping ( "/fileUploadCrossServer" )
public String fileUploadCrossServer ( MultipartFile upload) throws IOException {
System. out. println ( "跨服务器上传文件" ) ;
String path = "http://localhost:9090/uploads/" ;
String filename = upload. getOriginalFilename ( ) ;
filename = URLEncoder. encode ( filename, "UTF-8" ) ;
filename = UUID. randomUUID ( ) . toString ( ) . replaceAll ( "-" , "" ) + "_" + filename;
Client client = Client. create ( ) ;
WebResource webResource = client. resource ( path + filename) ;
webResource. put ( upload. getBytes ( ) ) ;
return "success" ;
}
注意: ① 方法参数MultipartFile upload这里的形参名upload必须和前端页面index.jsp中file类型的input的name属性值一样 ②构建上传的文件名这里,首先要使用java.net.URLEncoder进行编码,以解决中文乱码的问题,其次要使用UUID构建出唯一的文件名,以避免因为名称相同而相互覆盖
springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
< beans xmlns = " http://www.springframework.org/schema/beans"
xmlns: xsi= " http://www.w3.org/2001/XMLSchema-instance"
xmlns: context= " http://www.springframework.org/schema/context"
xmlns: mvc= " http://www.springframework.org/schema/mvc"
xsi: schemaLocation= " http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd" >
< context: component-scan base-package = " com.espen" />
< bean id = " viewResolver" class = " org.springframework.web.servlet.view.InternalResourceViewResolver" >
< property name = " prefix" value = " /WEB-INF/pages/" />
< property name = " suffix" value = " .jsp" />
</ bean>
< mvc: annotation-driven/>
< mvc: resources mapping = " /static/**" location = " /static/" />
< bean id = " multipartResolver" class = " org.springframework.web.multipart.commons.CommonsMultipartResolver" />
</ beans>
注意: 除了视图解析器和注解支持、静态资源映射等,还需要配置一个文件解析器,使用CommonsMultipartResolver