在使用SpringMVC配合com.sun.jersey进行跨服务器上传文件时,遇到了各种各样的问题,百度了也尝试了N多种方法,最终才一个个的解决,真是心累啊。。。
案例的代码如下,格式或者规范各位大佬就不要介意了,这里主要是记录这次解决问题的历程而已,嘿嘿嘿
@RequestMapping("/t3")
public String test3(@RequestParam(value = "uploadFile") MultipartFile multipartFile)
throws Exception {
String filename = UUID.randomUUID() + "_" + multipartFile.getOriginalFilename();
System.out.println("filename=" + filename);
final String UPLOAD_FILE_HOST_URL = "http://localhost:9080/mvc11server/uploads/";
//创建服务器客户端对象
Client client = Client.create();
//连接文件存储服务器
WebResource webResource = client.resource(UPLOAD_FILE_HOST_URL + filename);
//写入上传数据
webResource.put(multipartFile.getBytes());
return "main";
}
下面开始列出遇到的各种问题以及对应的解决方案
错误一
HTTP Status 500 – Internal Server Error
Type 异常报告
消息 Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: com/sun/jersey/api/client/Client
解决方案
项目或module发布时缺少了com.sun.jersey的jar,因此发布时需要手动添加lib文件夹,并lib目录添加jar包,如下图所示:
错误二
HTTP Status 500 – Internal Server Error
Type 异常报告
消息 Request processing failed; nested exception is com.sun.jersey.api.client.UniformInterfaceException: PUT http://localhost:9080/mvc11server/uploads/609e519f-5ab6-4767-b0b1-709c774bab4e_barcode.txt returned a response status of 405 Method Not Allowed
解决方案
在tomcat默认安全的设置中,默认不支持PUT和DELETE请求的写入操作(个人理解),因此需要手动修改默认权限设置,步骤如下:
进入tomcat的安装目录(即:CATALINA_HOME),打开conf/web.xml文件,在<servlet></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>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>
错误三(也是最坑爹一个错误)
HTTP Status 500 – Internal Server Error
Type 异常报告
消息 Request processing failed; nested exception is com.sun.jersey.api.client.ClientHandlerException: java.net.SocketException: Software caused connection abort: recv failed
解决方案
这个错误是几个错误中最坑爹的,也是最无语的,我查了好久才发现这个错误的原因,原来tm的是默认不支持路径中包含中文的文件,因为文件接收服务器如果不设置编码格式,默认使用的是ISO-8859-1。
所以,要么改文件名不要含中文,或者再文件接受服务器上添加一个过滤器,设置request的统一编码格式。