SpringMVC实现上传下载文件
作者:凌冰_ 发布时间:2022-11-10 03:18:14
标签:SpringMVC,上传,下载
本文实例为大家分享了SpringMVC实现上传下载文件的具体代码,供大家参考,具体内容如下
一、SpringMVC专门提供了CommonsMultipartResolver组件用于文件上传:
(1)maxUploadSize 文件最大限制,单位是byte
(2)maxInMemorySize 低于这个大小的文件暂存内存中
(3)defaultEncoding 默认编码utf-8
必须在spring-mvc.xml文件
<!-- (2)配置 MultipartResolver 实现文件上传
注意:id="multipartResolver"是固定写法
-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 字符编码 -->
<property name="defaultEncoding" value="utf-8"/>
<!-- max size 10M -->
<property name="maxUploadSize" value="10485760000"/>
<!--内存中最大 4K -->
<property name="maxInMemorySize" value="4096"/>
</bean>
二、SpringMVC文件上传引入jar包
必须在配置Pom.xml文件
<!-- fileupload start -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!-- end -->
三、实现【单个文件】上传
(1)JSP页面必须放在WEB-INF下 upload1.jsp 必须添加enctype="multipart/form-data"
<body>
<div style="margin: 0 auto; margin-top: 100px; background:snow">
<form method="post" action="upload1.html" name="form1"
enctype="multipart/form-data">
<p>
照片:<input type="file" name="imagefile">
<input type="submit" value="上传" name="button1"> <br>
</p>
</form>
</div>
(2) 写控制类 UploadController.java
@Controller
public class UploadController {
@RequestMapping("upload1")
public String getUpload(@RequestParam("imagefile") MultipartFile imagefile,
HttpServletRequest request) {
// 获取上传的服务器路径
String pathString = request.getSession().getServletContext().getRealPath("/upload/");
// 获取文件
String fileName = imagefile.getOriginalFilename();
System.out.println(fileName);
// 判断上传的路径是否存在
File file = new File(pathString);
if (!file.exists()) {
file.mkdirs();
}
System.out.println("上传路径=" + pathString +"/"+ fileName);
// 文件不存在
File targetFile = new File(pathString +"/"+ fileName);
if (!targetFile.exists()) {
try {
targetFile.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
// 上传
imagefile.transferTo(targetFile);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//注意:/springmvc5/WEB-INF/jsp/http:/localhost:8888/springmvc5/upload/1.gif.jsp
//返回文件,必须是重定向文件
return "redirect:http://localhost:8888/springmvc5/upload/" + fileName;
} }
(3)效果
选择图片路径:
单击上传:
四、实现【多个文件】上传
(1)JSP页面(必须放在WEB-INF下) upload2.jsp 必须添加enctype="multipart/form-data"
<body>
<div style="margin: 0 auto; margin-top: 100px; background:snow">
<form method="post" action="upload2.html" name="form1"
enctype="multipart/form-data">
<p>
照片1:<input type="file" name="imagefile1"><p/>
照片2:<input type="file" name="imagefile2"><p/>
<input type="submit" value="上传" name="button1"> <br>
</p>
</form>
</div>
</body>
(2) 写控制类 UploadController.java
@RequestMapping("upload2")
public String getUpload2(HttpServletRequest request) {
// 多文件上传
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
// 获得多个文件
Map<String, MultipartFile> map = multipartRequest.getFileMap();
// 获取上传的服务器路径
String pathString = request.getSession().getServletContext().getRealPath("/upload/");
// 判断上传的路径是否存在
File file1 = new File(pathString);
if (!file1.exists()) {
file1.mkdirs();
}
// 获取文件
List<String> list = new ArrayList<String>();
// 遍历数据
for (MultipartFile file : map.values()) {
String fileName = file.getOriginalFilename();
System.out.println("上传路径=" + pathString +"/"+ fileName);
// 文件不存在
File targetFile = new File(pathString +"/"+ fileName);
if (!targetFile.exists()) {
try {
targetFile.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
// 上传
file.transferTo(targetFile);
// 保存路径
list.add("http://localhost:8888/springmvc5/upload/" + fileName);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 保存每个上传的路径
request.setAttribute("files", list);
return "showUpload"; //跳转到showUpload.jsp页面哦!
}
注意:return "showUpload";是具体显示的页面;必须配置视图解析器在spring-mvc.xml文件中
<!--(1) spring 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"></bean>
(3)JSP页面: showUpload.jsp
<div style="margin: 0 auto; margin-top: 100px; background:snow">
<%
List<String> list =(List<String>) request.getAttribute("files");
for(String str:list){
%>
<a href="<%=str%>" rel="external nofollow" ><img src="<%=str%>" alt=""/></a>
<%} %>
</div>
(4)效果
单击上传:
查看上传到服务器的图片
五、下载图片
(1)JSP页面 login.jsp
<a href="download.html?fileName=08.gif" >下载图片</a><p/>
(2)控制类DownController
@Controller
public class DownController {
@RequestMapping("/download")
public String download(@RequestParam String fileName,
HttpServletRequest request, HttpServletResponse response) {
// 设置响应编码
response.setContentType("text/html;charset=utf-8");
// 设置请求编码
try {
request.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 字节流
BufferedInputStream bis=null;
BufferedOutputStream bos=null;
// 获取服务器的路径
String path = request.getSession().getServletContext().getRealPath("/upload/");
// 下载的路径
String downPath = path +"/"+ fileName;
try {
// 文件大小
long fileSize = new File(downPath).length();
//设置内容类型
response.setContentType("application/x-msdownload");
//设置头信息
response.setHeader("Content-disposition", "attachment; filename="+new String(fileName.getBytes("utf-8"),"ISO8859-1"));
response.setHeader("Content-Length",String.valueOf(fileSize));
//字节流
bis = new BufferedInputStream(new FileInputStream(downPath));
bos= new BufferedOutputStream(response.getOutputStream());
//字节数组
byte[] by = new byte[2048];
//
int length=0;
//读取
while((length=bis.read(by,0,by.length))!=-1){
//写入
bos.write(by, 0, length);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
//关闭连接
if(bis!=null){
try {
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(bos!=null){
try {
bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
}
(3)效果
保存或打开如下:
来源:https://blog.csdn.net/hlx20080808/article/details/51980320


猜你喜欢
- 适配器(Adapter)模式:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一
- 引言:关于java IO流的操作是非常常见的,基本上每个项目都会用到,每次遇到都是去网上找一找就行了,屡试不爽。上次突然一个同事问了我jav
- Spring boot项目结合docker容器用,打了个jar包,启动的时候竟然说:no main manifest attribute,
- 相关概念1.Handler:可以看做是一个工具类,用来向消息队列中插入消息的;2.Thread:所有与Handler相关的功能都是与Thre
- 3.3 do...while()循环3.3.1 do语句的语法:do
- C++ 11中的互斥量,声明在 <mutex> 头文件中,互斥量的使用可以在各种方面,比较常用在对共享数据的
- 简述SpringBoot对Spring的的使用做了全面的封装,使用SpringBoot大大加快了开发进程,但是如果不了解Spring的特性,
- 本文实例分析了Android中ListActivity用法。分享给大家供大家参考,具体如下:程序如下:import android.app.
- 创建个SpringBoot项目勾选生所需的依赖:我把application的后缀改为.yml了,方便些。 pom.xml:<?xml
- 责任链模式责任链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递
- 一、常见问题所有的final修饰的字段都是编译期常量吗?如何理解private所修饰的方法是隐式的final?说说final类型的类如何拓展
- 前言学过定时任务,但是我忘了,忘得一干二净,害怕,一直听别人说:你写一个定时任务就好了。写个定时任务让他去爬取就行了。我不会,所以现在得补回
- Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,
- C#延时函数使用在线程中如果需要延时,尽量不要使用Sleep()函数,这样会导致时间片切到别的线程中。使用如下函数:
- 一、异步模型的基本概述异步编程的核心是 Task 和 Task<T> 对象,这两个对象对异步操作建模。 它们受关键字 async
- 大家先看下效果图:Android为我们提供了四种应组件,分别为Activity、Service、Broadcast receivers和Co
- 本文实例讲述了Android编程实现Listview点击展开和隐藏的方法。分享给大家供大家参考,具体如下:代码较多,所以找关键点大家贴出来,
- 简述Preference是Android的控件之一,相对来说我们用的比较少,但在系统应用的Settings设置应用模块中大部分由Prefer
- spring data JPA的多属性排序在此介绍我所用的一种方式:第一步,引包import org.springframework.dat
- 大家都知道 Android 的 Activity 是存着历史栈的,比如从 A -> B -> C,C 完成 finish 后回到