SpringMVC 实现文件上传

文章源码

文件上传回顾

查看 JavaWeb 阶段的文件上传下载

实现步骤:

  • 客户端:

    • 发送 post 请求,告诉服务器要上传什么文件
  • 服务器:
    • 要有一个 form 标签,method=post 请求,form 标签的 encType 属性值必须为 multipart/form-data
    • form 标签中使用 input type=file 添加上传的文件接收并处理上传的文件

文件上传时 HTTP 协议说明:

  • Content-type 表示提交的数据类型

    • multipart/form-data 表示提交的数据,以多段(每一个表单项代表一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器
    • boundary 表示每段数据的分隔符,它的值是有浏览器随机生成的,它是每段数据的分割符

实现上传下载功能常用两个包:

  • commons-fileupload-1.3.1.jar
  • commons-io-2.4.jar

FileUploadController.java

@Controller
@RequestMapping("/file")
public class FileUploadController { /**
* 文件上传回顾
* @return
*/
@RequestMapping(path = {"/upload1"})
public String upload1(HttpServletRequest request) throws Exception {
System.out.println("called upload1..."); String path = request.getSession().getServletContext().getRealPath("/uploads"); // 获取到要上传的文件目录
System.out.println(path);
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
} DiskFileItemFactory factory = new DiskFileItemFactory(); // 创建磁盘文件项工厂
ServletFileUpload fileUpload = new ServletFileUpload(factory);
List<FileItem> fileItems = fileUpload.parseRequest(request); // 解析request对象
for (FileItem fileItem : fileItems) {
if (fileItem.isFormField()) { // 判断文件项是普通字段,还是上传的文件
System.out.println(fileItem.getName());
} else {
String itemName = fileItem.getName(); // 获取到上传文件的名称
itemName = UUID.randomUUID().toString() + "-" + itemName; // 把文件名唯一化
fileItem.write(new File(file, itemName)); // 上传文件
fileItem.delete();
}
} return "success";
}
}

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<h3>文件上传回顾</h3>
<form action="file/upload1" method="post" enctype="multipart/form-data">
名称:<input type="text" name="picName"/><br/>
图片:<input type="file" name="picFile"/><br>
<input type="submit" value="上传文件"/>
</form>
</body>
</html>

SpringMVC 传统方式的文件上传

传统方式的文件上传,指的是我们上传的文件和访问的应用存在于同一台服务器上。并且上传完成之后,浏览器可能跳转。

SpringMVC 框架提供了 MultipartFile 对象,该对象表示上传的文件,要求变量名称必须和表单 file 标签的 name 属性名称相同。并且需要配置文件解析器对象

    <!-- 配置 文件解析器,要求 id 名称必须是 multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>
</bean>

FileUploadController.java

@Controller
@RequestMapping("/file")
public class FileUploadController { /**
* SpringMVC 传统方式的文件上传
* @return
*/
@RequestMapping(path = {"/upload2"})
public String upload2(HttpServletRequest request, String picName, MultipartFile picFile) throws Exception {
System.out.println("called upload2...");
String path = request.getSession().getServletContext().getRealPath("/uploads"); // 获取到要上传的文件目录
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
} String fileName = picName + "-" + picFile.getOriginalFilename();
fileName = UUID.randomUUID().toString() + "-" + fileName;
picFile.transferTo(new File(file, fileName)); // 上传文件 return "success";
}
}

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<h3>SpringMVC 传统方式文件上传</h3>
<form action="file/upload2" method="post" enctype="multipart/form-data">
名称:<input type="text" name="picName"/><br/>
图片:<input type="file" name="picFile"/><br>
<input type="submit" value="上传文件"/>
</form>
<br>
</body>
</html>

SpringMVC 跨服务器方式的文件上传

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

  • 应用服务器:负责部署应用
  • 数据库服务器:运行数据库
  • 缓存和消息服务器:负责处理大并发访问的缓存和消息
  • 文件服务器:负责存储用户上传文件的服务器

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

准备两个 Tomcat 服务器,注意 HTTP Port 和 JMX Port 不能相同。

一个用作文件服务器,并创建一个用于存放文件的 web 工程。文件服务器源码,并修改文件服务器的 web.xml 配置,使其可以支持写入操作,搜索 DefaultServlet,添加以下代码:

<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>

另一个 Tomcat 服务器,编写以下代码


FileUploadController.java

@Controller
@RequestMapping("/file")
public class FileUploadController { /**
* SpringMVC 跨服务器方式的文件上传
* @return
*/
@RequestMapping(path = {"/upload3"})
public String upload3( String picName, MultipartFile picFile) throws Exception {
System.out.println("called upload3..."); String path = "http://localhost:9090/file-server/uploads/"; // 定义上传文件服务器路径 String fileName = picName + "-" + picFile.getOriginalFilename();
fileName = UUID.randomUUID().toString() + "-" + fileName; // 1. 创建客户端对象
Client client = Client.create(); // 2. 和文件服务器进行连接
WebResource resource = client.resource(path + fileName); // 3. 上传文件,跨服务器的
resource.put(picFile.getBytes()); return "success";
}
}

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<h3>SpringMVC 跨服务器方式文件上传</h3>
<form action="file/upload3" method="post" enctype="multipart/form-data">
名称:<input type="text" name="picName"/><br/>
图片:<input type="file" name="picFile"/><br>
<input type="submit" value="上传文件"/>
</form>
</body>
</html>

练习和总结

【SpringMVC】SpringMVC 实现文件上传的更多相关文章

  1. 使用SpringMVC框架实现文件上传和下载功能

    使用SpringMVC框架实现文件上传和下载功能 (一)单个文件上传 ①配置文件上传解释器 <!—配置文件上传解释器 --> <mvc:annotation-driven>&l ...

  2. (转)SpringMVC学习(九)——SpringMVC中实现文件上传

    http://blog.csdn.net/yerenyuan_pku/article/details/72511975 这一篇博文主要来总结下SpringMVC中实现文件上传的步骤.但这里我只讲单个文 ...

  3. 深入springMVC源码------文件上传源码解析(下篇)

    在上篇<深入springMVC------文件上传源码解析(上篇) >中,介绍了springmvc文件上传相关.那么本篇呢,将进一步介绍springmvc 上传文件的效率问题. 相信大部分 ...

  4. springMVC实现多文件上传

    <h2>上传多个文件 实例</h2> <form action="/workreport/uploadMultiFile.html" method=& ...

  5. SpringMvc入门五----文件上传

      知识点: SpringMvc单文件上传 SpringMvc多文件上传   这里我直接演示多文件上传,单文件的上传就不说了,不过代码都是现成的. 效果预览:   DEMO图:     添加文件上传j ...

  6. SpringMvc MultipartFile 图片文件上传

    spring-servlet.xml <!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 --> <bean id="multipar ...

  7. SpringMVC+BUI实现文件上传(附详解,源码下载)

    中午有限时间写这博文,前言就不必多说了,直奔主题吧. BUI是一个前端框架,关于BUI的介绍请看博主的文章那些年用过的一些前端框架. 下面我们开始实例的讲解! 一.效果演示: 上传成功后,会发现本地相 ...

  8. SpringMVC国际化与文件上传

    点击阅读上一章 其实SpringMVC中的页面国际化与上一章的验证国际化基本一致. 1.对页面进行国际化 1)首先我们对Spring配置文件中添加国际化bean配置 <!-- 注册国际化信息,必 ...

  9. 2017/2/12:springMVC的简单文件上传跟拦截器

    1.写文件上传的界面jsp代码如下重点为文件上传标签的类型 2.写登录成功跟失败的界面:成功自己写 3.写springMVC的文件上传的controller的方法 4.最后一步配置spring-ser ...

  10. SpringMVC框架06——文件上传与下载

    1.文件上传 Spring MVC框架的文件上传是基于commons-fileupload组件的文件上传,只不过Spring MVC框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现. ...

随机推荐

  1. bootstrap table 控制checkbox在某些状态不显示

    首先columns:[{field:'column',checkbox:true}];然后设置$("#tableName").bootstrapTable('hideColumn' ...

  2. SPFA算法优化

    前言 \(SPFA\) 通常在稀疏图中运行效率高于 \(Dijkstra\) ,但是也容易被卡. 普通的 \(SPFA\) 时间复杂度为 \(O(km)\) ,其中 \(k\) 是一条边松弛其端点点的 ...

  3. NOIP2020 浙江 游记

    day - ? 由于 CSP-S 的失利,感觉这一次 NOIP 的心态反而是非常的淡定,感觉反正已经炸过一次了,再炸一次好像也没什么,就抱着这样的心态去考试的. day 1 考试当天起晚了,到考场的时 ...

  4. springboot配置ssl证书

    springboot默认使用的是tomcat: 1.先到阿里云上注册一个证书,绑定域名:后面可以在管理中下载证书,下载tomcat对应的证书(一个*.pfx文件和*.txt文件) 2.将pfx文件拷贝 ...

  5. win32 C++制作美观按钮,告别win32 API编程中默认的灰色按钮

    使用win32 API制作美观按钮,当鼠标移入/移出按钮时改变按钮背景颜色,类似HTML网页中的效果,告别win32 API编程中默认的灰色按钮,效果图见下面动图和视频. 下载地址: 按钮效果(win ...

  6. oracle DG搭建

    Oracle DG 搭建1. 环境 OS IP hostname db_name DB_UNIQUE_NAME主库 RHEL 5.4 192.168.12.20 edgzrip1.oracle.com ...

  7. Happens-Before原则到底规定了什么

    Happens-Before 规则 如何理解 Happens-Before 呢?如果望文生义(很多网文也都爱按字面意思翻译成"先行发生"),那就南辕北辙了,Happens-Befo ...

  8. 微信小程序api拦截器

    微信小程序api拦截器 完美兼容原生小程序项目 完美兼用小程序api的原本调用方式,无痛迁移 小程序api全Promise化 和axios一样的请求方式 小程序api自定义拦截调用参数和返回结果 强大 ...

  9. 2020-2021-1 20209307《Linux内核原理与分析》第三周作业

    一.计算机的三大法宝 存储程序计算机.函数调用堆栈机制.中断机制 二.堆栈 堆栈的作用:记录函数调用框架.传递函数参数.保存返回值的地址.提供局部变量存储空间 堆栈操作:push栈顶地址减少四个字节. ...

  10. Java获取到异常信息进行保存(非Copy)

    吐槽:不知道从什么时候开始,各大博客网站的文章开始各种复制粘贴,想好好找一个解决方法,搜索出来的博客基本上千篇一律,主要是能解决问题也还行,还解决不了问题这就恶心了.... 所以被迫自己写一篇文章,然 ...