从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 新闻合订本
    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 新闻合订本
    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • JavaSE

  • JavaSenior

  • JavaEE

  • JavaWeb

  • Spring

  • 主流框架

  • SpringMVC

    • SpringMVC 基本概念
    • SpringMVC 入门案例
    • SpringMVC 中的组件介绍
    • RequestMapping 注解的作用
    • 请求参数的绑定
    • 自定义类型转换器
    • 使用原生的 Servlet-API
    • SpringMVC 常用注解
    • 响应数据和结果视图
    • 文件上传
    • 文件上传之跨服务器
      • 需求
      • 环境准备
      • 搭建图片服务项目
      • 新增表单
      • 引入依赖
      • 新增控制器方法
      • 重启并测试
      • 如果遇到报错
      • 源码
    • SpringMVC 的异常处理
    • SpringMVC 的拦截器
    • SSM 整合
  • SpringBoot

  • Java
  • SpringMVC
2023-05-15
目录

文件上传之跨服务器

# 100.文件上传之跨服务器

‍实现跨服务器上传 ‍

# 需求

在实际开发中,我们会有很多处理不同功能的服务器。例如:

  • 应用服务器:负责部署我们的应用
  • 数据库服务器:运行我们的数据库
  • 缓存和消息服务器:负责处理大并发访问的缓存和消息
  • 文件服务器:负责存储用户上传文件的服务器。(例如本博客就使用了第三方图床,其实也就是一个文件服务器)

分服务器处理的目的是让服务器各司其职,从而提高我们项目的运行效率。

# 环境准备

首先我们得有一个图片的服务器;其次得解决应用服务器如何将图片传过去。

这里我们使用 jersey-client 和 jersey-core 的依赖,这是 sub 公司提供的,可以实现传图片的问题。

# 搭建图片服务项目

新建一个模块:

修改 index.jsp

<html>
<body>
<h2>Hello File Server!</h2>
</body>
</html>
1
2
3
4
5

‍ 新建 webapp/uploads 文件夹,后续我们上传文件就在该目录下

同时,我们需要准备 2 个 Tomcat,可以在 IDEA 中新建一个配置。点击编辑配置:

‍

然后在右上角点击加号--然后在列表中找到 Tomcat 服务器

‍

然后我们给该启动配置,改个名;然后修改端口,不和另一个 Tomcat 冲突

然后我们点击修复-并选择 fileUploadServer: war

我们启动,可以看到能正常访问首页 index.jsp

# 新增表单

我们在应用服务器的项目里,新增一个表单:

<h3>跨服务器文件上传</h3>
<form action="/user/fileUpload3" method="post" enctype="multipart/form-data">
    选择文件:<input type="file" name="upload"/> <br/>
    <input type="submit" value="上传"/>
</form>
1
2
3
4
5

# 引入依赖

<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>
1
2
3
4
5
6
7
8
9
10
11

‍

# 新增控制器方法

‍ 我们复制一份 fileUpload2 方法,并改下路径和方法名为 3:

@RequestMapping("/fileUpload3")
public String fileUpload3(HttpServletRequest request, MultipartFile upload) throws IOException {

    System.out.println("fileUpload2");


    String realPath = request.getSession().getServletContext().getRealPath("/uploads/");
    System.out.println("realPath: " + realPath);
    File file = new File(realPath);
    if (! file.exists()) {
        // 创建该文件夹
        file.mkdirs();
    }


    String originalFilename = upload.getOriginalFilename();
    String uuid = UUID.randomUUID().toString().replace("-", "");// 防止文件名重复,这里我们将减号替换为空字符串
    originalFilename = uuid + "_" + originalFilename;
    upload.transferTo(new File(realPath, originalFilename));
    return "success";
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

‍ 我们删除获取文件路径的代码:因为我们是跨服务器了,所以不用这个代码。

String realPath = request.getSession().getServletContext().getRealPath("/uploads/");
System.out.println("realPath: " + realPath);
File file = new File(realPath);
if (! file.exists()) {
    // 创建该文件夹
    file.mkdirs();
}
1
2
3
4
5
6
7

‍ 方法参数中的 HttpServletRequest request, 也可以删了。然后关于上传的部分也可以删了:

upload.transferTo(new File(realPath, originalFilename));
1

‍ 此时我们的方法如下:

@RequestMapping("/fileUpload3")
public String fileUpload3(HttpServletRequest request, MultipartFile upload) throws IOException {
    System.out.println("fileUpload3");
    String originalFilename = upload.getOriginalFilename();
    String uuid = UUID.randomUUID().toString().replace("-", "");// 防止文件名重复,这里我们将减号替换为空字符串
    originalFilename = uuid + "_" + originalFilename;
    return "success";
}
1
2
3
4
5
6
7
8

‍ 然后我们定义一个路径,表示要上传的文件的地址,这里我们以 fileUpload 项目的地址为例:

 // 定义上传文件服务器的路径
String path = "http://localhost:9090/fileUploadServer_war/uploads/";
1
2

‍ 接下来我们要做的是:

  1. 创建客户端对象 Client
  2. 和图片服务器进行连接
  3. 上传图片 ‍
// 创建客户端对象
Client client = Client.create();

// 和文件服务器进行连接
WebResource resource = client.resource(path + originalFilename);

// 上传文件
resource.put(upload.getBytes());
1
2
3
4
5
6
7
8

‍

# 重启并测试

然后我们重启,上传图片测试,可以看到 fileUploadServer 项目里能正常有图片

# 如果遇到报错

如果在上传图片后,遇到报错:

com.sun.jersey.api.client.UniformInterfaceException: ... returned a response status of 403
1

是因为 Tomcat 默认禁止上传,在 Tomcat 中的 config 中的 web.xml 中进行以下的配置就可以进行文件的上传了.

在 Tomcat 配置文件中 ( apache-tomcat-8.0.50\conf\web.xml)113 行左右,添加如下代码

<init-param> 
	<param-name>readonly</param-name> 
	<param-value>false</param-value> 
</init-param>
1
2
3
4

添加后部分配置如下:

重启服务器即可。

# 源码

本项目已将源码上传到 GitHub (opens new window) 和 Gitee (opens new window) 上。并且创建了分支 demo9,读者可以通过切换分支来查看本文的示例代码。

上次更新: 2025/5/17 12:26:09
文件上传
SpringMVC 的异常处理

← 文件上传 SpringMVC 的异常处理→

最近更新
01
新闻合订本 2025-10
10-31
02
2025 年 10 月记
10-30
03
用 AI 批量优化思源笔记排版
10-15
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式