要将某个文件,从客户端服务器传送到专门管理文件的文件服务器,由于是两个不同的服务器,就用到了跨服务器上传。
一、准备第二个项目,用于创建文件服务器
像之前创建maven项目一样,创建一个目录,代码方面没什么改动,也不用导什么依赖,单纯配一个服务器就行,注意改这两个,否则会和客户端的端口产生冲突。原本的是8080和1099。
配置好服务器就可以启动这个服务器了!
二、导入必要的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>
三、编写代码
index.jsp:
<form action="upload/testUploadToFileServer" method="post" enctype="multipart/form-data">
上传文件:<input type="file" name="upload"><br>
<input type="submit" value="上传">
</form>
controller:
我们上传到这个文件服务器地址下的uploads目录。
文件服务器地址http://localhost:9090/uploadServer_war/
就是复制文件服务器启动的那个地址栏即可,后面加上文件存放的目录。
@Controller
@RequestMapping("upload")
public class uploadController {
@RequestMapping("testUploadToFileServer")
public String testUploadToFileServer(MultipartFile upload) throws IOException {
System.out.println("testUploadToFileServer方法执行了");
//定义上传文件到文件服务器地址的该目录
String path = "http://localhost:9090/uploadServer_war/uploads/";
//生成唯一文件名
String fileName = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replace("-","").trim();
fileName = uuid + "_" + fileName;
//创建应用客户端对象
Client client = Client.create();
//连接图片服务器
WebResource webResource = client.resource(path + fileName);
//上传文件
webResource.put(upload.getBytes());
return "success";
}
}
四、坑
代码是编写完了,在运行的时候出现了一些小错误
1、运行的时候可能会报409错误,这是因为我们文件服务器的地址下面没有uploads文件夹,因此我们要手动进入tomcat服务器项目路径,比如我这是
2、报了405这个错误:returned a response status of 405 Method Not Allowed
意思是方法不对,但是springmvc的MultipartFile要求我们必须使用post方法,这个是定死了。后来有幸看到tomcat9文件上传returned a response status of 405 Method Not Allowed这一篇博客,设置完之后直接就好了!非常感谢。
具体方法如下:
1、找到tomcat路径下,打开conf文件夹下的web.xml文件
2、使用记事本打开,查找这一项servlet配置
3、设置readonly为false
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
3、如果上传的文件名出现了中文等奇怪的字符,将会报如下错误
The valid characters are defined in RFC 7230 and RFC 3986
就是不符合那两个规范,目前我的解决方法只是不要传有中文的文件…