【SpringMVC】SpringMVC 实现文件上传
SpringMVC 实现文件上传
文件上传回顾
实现步骤:
- 客户端:
- 发送 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.jarcommons-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 实现文件上传的更多相关文章
- 使用SpringMVC框架实现文件上传和下载功能
使用SpringMVC框架实现文件上传和下载功能 (一)单个文件上传 ①配置文件上传解释器 <!—配置文件上传解释器 --> <mvc:annotation-driven>&l ...
- (转)SpringMVC学习(九)——SpringMVC中实现文件上传
http://blog.csdn.net/yerenyuan_pku/article/details/72511975 这一篇博文主要来总结下SpringMVC中实现文件上传的步骤.但这里我只讲单个文 ...
- 深入springMVC源码------文件上传源码解析(下篇)
在上篇<深入springMVC------文件上传源码解析(上篇) >中,介绍了springmvc文件上传相关.那么本篇呢,将进一步介绍springmvc 上传文件的效率问题. 相信大部分 ...
- springMVC实现多文件上传
<h2>上传多个文件 实例</h2> <form action="/workreport/uploadMultiFile.html" method=& ...
- SpringMvc入门五----文件上传
知识点: SpringMvc单文件上传 SpringMvc多文件上传 这里我直接演示多文件上传,单文件的上传就不说了,不过代码都是现成的. 效果预览: DEMO图: 添加文件上传j ...
- SpringMvc MultipartFile 图片文件上传
spring-servlet.xml <!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 --> <bean id="multipar ...
- SpringMVC+BUI实现文件上传(附详解,源码下载)
中午有限时间写这博文,前言就不必多说了,直奔主题吧. BUI是一个前端框架,关于BUI的介绍请看博主的文章那些年用过的一些前端框架. 下面我们开始实例的讲解! 一.效果演示: 上传成功后,会发现本地相 ...
- SpringMVC国际化与文件上传
点击阅读上一章 其实SpringMVC中的页面国际化与上一章的验证国际化基本一致. 1.对页面进行国际化 1)首先我们对Spring配置文件中添加国际化bean配置 <!-- 注册国际化信息,必 ...
- 2017/2/12:springMVC的简单文件上传跟拦截器
1.写文件上传的界面jsp代码如下重点为文件上传标签的类型 2.写登录成功跟失败的界面:成功自己写 3.写springMVC的文件上传的controller的方法 4.最后一步配置spring-ser ...
- SpringMVC框架06——文件上传与下载
1.文件上传 Spring MVC框架的文件上传是基于commons-fileupload组件的文件上传,只不过Spring MVC框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现. ...
随机推荐
- Windows远程报错:由于没有远程桌面授权服务器可以提供许可证,远程会话被中断
故障原因:Windowsserver超过两人的远程连接是收费的,有120天免费试用期,超过这个时间再连接就会报错. 解决方法一: 进行续费 解决方法二: 1,在运行里运行 mstsc /v:ip ...
- Git中一个由readme.md文件引起的问题
githup中建立远程仓库时,勾选了创建readme文件,本地仓库无法push,解决方法: https://blog.csdn.net/ashencode/article/details/816249 ...
- Linux命令-2.文件属性
在Linux系统中文件的属性有:文件类型.属主属性.属组属性.其他属性,使用10个字符表示,如下图: 其中第0位表示文件类型: 当为[ d ]则是目录 当为[ - ]则是文件: 若是[ l ]则表示为 ...
- html 09-HTML5详解(三)
09-HTML5详解(三) #Web 存储 随着互联网的快速发展,基于网页的应用越来越普遍,同时也变的越来越复杂,为了满足各种各样的需求,会经常性在本地存储大量的数据,传统方式我们以document. ...
- css 16-浏览器的兼容性问题
16-浏览器的兼容性问题 我们在div里放一个img,发现: 在html和html5中,div的长宽是不同的,后者的高度要超过几个像素. 比如说,下面这个是html的. <!DOCTYPE ht ...
- Unity射击实例讲解—子弹创建
前言: 这一篇章会介绍如何创建最基本的射击用子弹,示例用工程进度也往后推了许多,有时间会都整理了发出来,学艺尚浅有一些东西不能讲明白,后续学习深入会慢慢补足.另外自己魔改过的版本也是花钱买了一些模型, ...
- Spring笔记(9) - IOC实现方式详解
IOC概念 控制反转(Inversion of Control,IOC),是面向对象编程中的一种设计原则,它建议将不需要的职责移出类,让类专注于核心职责,从而提供松散耦合,提高优化软件程序设计.它把传 ...
- Spring Cloud Alibaba基础教程-Nacos(二)
在Spring Cloud Alibaba基础教程-Nacos(一)当中学习了,如何从 nacos当中 通过Java的方式获取值,以及连接数据库,下面我们开始第二篇的学习 ,如果对你有帮助,方便下次寻 ...
- Python学习之多项式回归
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 线性回归的改进版本中的多项式回归.如果您知道线性回归,那么对您来说很简单.如果没有,我将在本文中解释 ...
- 豆瓣读书top250数据爬取与可视化
爬虫–scrapy 题目:根据豆瓣读书top250,根据出版社对书籍数量分类,绘制饼图 搭建环境 import scrapy import numpy as np import pandas as p ...