- 除了spring相關的依賴依賴,我們需要添加jersey的兩個相關依賴,版本信息可以不同。
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19.4</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.19.4</version>
</dependency>
- 在springmvc.xml文件中,配置文件解析器
<!--配置文件解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"></property>
</bean>
- 編寫前端頁面。
<form action="file/fileServer8082" method="post" enctype="multipart/form-data">
選擇文件:<input type="file" name="fileUpload"/>
<br/>
<input type="submit" value="上傳"/>
</form>
因爲是跨服務器上傳,所以這裏我們需要搭建兩個tomcat環境,web用8081,文件服務器用8082。
文件服務器需要在tomcat安裝目錄的web.xml文件中加入初始化參數:readonly=false,否則上傳時可能會報403。
<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>
- 編寫前端控制器
@RequestMapping("/fileServer8082")
public String doSpringMvcFileUpload(MultipartFile fileUpload) throws Exception {
//聲明文件上傳服務器地址
String path = "http://localhost:8082/uploads/";
System.out.println(path);
String fileName = fileUpload.getOriginalFilename();
String uuid = UUID.randomUUID().toString();
fileName = uuid + "-" + fileName;
//創建客戶端對象
Client client = Client.create();
//與文件服務器進行連接
WebResource webResource = client.resource(path+fileName);
//文件上傳
webResource.put(fileUpload.getBytes());
return "uploadSuccess";
}
- 注意:上傳時還特別容易報409,原因是對應服務器目錄下沒有那個/uploads/文件目錄,這時需要手動創建一個。跨服務器文件上傳,相較於本地上傳,改動其實不算大,只需要添加jersey組件,邏輯還是非常清晰。但實際操作的時候還是非常可能出現一些奇葩異常,非常建議初學者動手敲一敲。