很多情况下,我们的文件服务器与业务服务器是分开的,因此,当用户在向业务服务器提交上传文件请求时,我们会将用户上传的文件跨服务器提交到我们的文件服务器中。下面简单记录下实现过程:
1、准备工作
1.1、准备两个独立服务器
我们的准备工作需要模拟两个独立服务器,一个是文件服务器,一个是业务服务器,文件服务器仅仅用于存储用户提交过来的文件信息,业务服务器负责将用户上传的文件跨服务器提交到文件服务器中。
为了模拟两个独立的服务器,我们准备两个tomcat服务器,分别占用不同的端口。
1、业务服务器使用tomcat默认配置。
2、文件服务器为了与业务服务器区分开,我们对其端口做了修改。修改的文件为:tomcat目录/confi/server.xml



3、编辑文件服务器的tomcat目录/confi/web.xml文件,在
<servlet></servlet>
节点下新增以下代码:
1 | <init-param> |
修改后,该节点代码应该为【这一步是防止出现403错误】:
1 | <servlet> |
1.2、为两个服务器创建对应的动态网站
1、由于文件服务器不需要太多逻辑控制,因此在对应的服务器中创建文件夹即可:在文件服务器tomcat的webapps下创建目录uploadFiles
【表示创建一个web应用】,再在uploadFiles
下创建子目录files
此目录用于存放用户上传的普通文件。示意图如下:

至此,我们的文件服务器配置已完成。【文件服务器不需要引入任何库或者java代码】
2、业务服务器就是我们常规~的业务开发,下面针对文件上传做介绍。
2、业务服务器文件上传功能
业务服务器文件上传功能大致和不跨浏览器类似,不跨服务器上传文件的介绍请参见: SpringMVC文件上传。
如果要完成跨服务器的文件上传,我们需要额外引入两个库,坐标如下:
【
注:如果项目不是MAVEN工程,只需要到这里:https://mvnrepository.com/参照坐标下载指定的jar包,导入到项目 WEB-INF 下的 lib 目录下即可。
】1
2
3
4
5
6
7
8
9
10
11
12<!-- 跨服务器文件上传的包 start -->
<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>
<!-- 跨服务器文件上传的包 end -->
接着完成Controller部分的逻辑,与传统本地存储不同的是,在Controller中接收到来自用户上传的文件后,需要将该文件与文件服务器建立连接,最后将文件传输到文件服务器。
实例代码如下【核心代码:19~30行】:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34"/files") (
public class FileUploadController {
"testCrossServerFileUpload") (
public String testCrossServerFileUpload(MultipartFile file){
if(file != null && !file.isEmpty()) {
String fileName = file.getOriginalFilename();
// 生成随机文件名
String uuid = UUID.randomUUID().toString().replaceAll("-","");
int suffixIndex = fileName.lastIndexOf(".");
// 如果有合法的后缀名,获取到后缀名
if(suffixIndex > 0){
fileName = fileName.substring(suffixIndex);
}else{
fileName = "";
}
fileName = uuid + fileName;
// 文件服务器地址
String baseUrl = "http://localhost/uploadFiles/files/";
// 创建跨服务器上传的文件传输客户端
Client client = Client.create();
// 创建WebResource对象(和图片服务器进行连接)
WebResource webResource = client.resource(baseUrl+fileName);
// 将字节码上传
try {
webResource.put(String.class,file.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
return "success";
}
}
前端代码如下【核心form表单在 11 ~ 26行,需要注意的是,文件上传的表单与传统表单的不同之处】:
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> |