springmv 文件上传和下载

springMVC的文件上传下载

1.准备工作

commons-io
commons-fileupload
在这里插入图片描述
在这里插入图片描述

2.普通单文件上传

1.创建index.jsp
在这里插入图片描述
2.创建FileUploadController

*/
@Controller
@RequestMapping("upload")
public class FileUploadController {
	/**
	 * 单文件上传
	 */
	@RequestMapping("upload01")
	public String upload01(MultipartFile mf,HttpSession session){
		System.out.println(mf);
		System.out.println(mf.getContentType()); //文件类型
		System.out.println(mf.getName());//input里面的name属性名 mf
		System.out.println(mf.getOriginalFilename());//文件名
		System.out.println(mf.getSize());//文件大小
//		System.out.println(mf.getInputStream());//得到文件流
		//1,得到文件上传的目录
		String realPath=session.getServletContext().getRealPath("/upload");
		//2,得到文件名
		String oldName=mf.getOriginalFilename();
		//3,构造文件对象
		File file=new File(realPath, oldName);
		//4,上传文件
		try {
			mf.transferTo(file);
		} catch (IllegalStateException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "success";
	}
}

3.配置springmvc.xml对文件上传的支持


	<!-- 配置对文件上传的支持 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 设置编码 -->
		<property name="defaultEncoding" value="UTF-8"></property>
		<!--设置文件上传的最大在小  -->
		<property name="maxUploadSize" value="21474836480"></property>
		<!--设置临时目录  -->
		<property name="uploadTempDir" value="/upload/temp"></property>
	</bean>

3.普通多文件上传

1.修改index.jsp
在这里插入图片描述
2.修改FileUploadController
在这里插入图片描述

4.普通文件上传改名字

为什么要改名字
因为不改名,那么上传的文件名如果相同,内容不同就会被覆盖
1.修改index.jsp
在这里插入图片描述
2.修改FileUploadController
在这里插入图片描述
3.创建RandomUtils


/**
 * 生成字符串的工具类
 * @author LJH
 *
 */
public class RandomUtils {

	//时间生成规则
	private static SimpleDateFormat format1=new SimpleDateFormat("yyyyMMddHHmmssSSS");
	
	//生成随机数对象
	private static Random random=new Random();
	
	/**
	 * 使用时间+四位随机数生成新的文件名
	 * @param oldName  dsfadsafdsafsdafads.fdsaf.sda.fdsa.f.sda.fdsa.fdsa.doc
	 * @return
	 */
	public static String createFileNameUseTime(String oldName) {
		//1,得到文件的后缀
		String suffix=oldName.substring(oldName.lastIndexOf("."), oldName.length());
		//2,得到时间的字符串
		String time=format1.format(new Date());
		//3,得到四位随机数
		Integer num=random.nextInt(9000)+1000;
		//4,拼接
		return time+"_"+num+suffix;
	}

	
	/**
	 * 使用uuid生成新的文件名
	 * @param oldName
	 * @return
	 */
	public static String createFileNameUseUUID(String oldName) {
		//1,得到文件的后缀
		String suffix=oldName.substring(oldName.lastIndexOf("."), oldName.length());
		//2,得到uuid
		String uuid=UUID.randomUUID().toString().replace("-", "");
		return uuid+suffix;
	}
	
}

5.普通文件上传改名字并分文件夹管理

为什么要分文件夹管理
如果整项目的文件都放一起,那么对文件夹的管理会非常困难
1.修改index.jsp
在这里插入图片描述
2.修改FileUploadController

/**
	 * 文件上传改名并分文件夹管理
	 */
	@RequestMapping("upload04")
	public String upload04(MultipartFile mf,HttpSession session){
		//1,得到文件上传的目录
		String realPath=session.getServletContext().getRealPath("/upload");
		//2,得到文件夹的名字
		String dirName=RandomUtils.createDirNameUserDate();
		//3,构造文件夹对象
		File dirFile=new File(realPath,dirName);
		//4,判断文件夹是否存在
		if(!dirFile.exists()){
			dirFile.mkdirs();//创建文件夹
		}
		//5,得到文件名
		String oldName=mf.getOriginalFilename();
		//6,生成新的文件名
		String newName=RandomUtils.createFileNameUseTime(oldName);
		//7,构造文件对象
		File file=new File(dirFile, newName);
		//5,上传文件
		try {
			mf.transferTo(file);
		} catch (IllegalStateException | IOException e) {
			e.printStackTrace();
		}
		return "success";
	}

3.修改RandomUtils
在这里插入图片描述
在这里插入图片描述

6.文件上传改名字并分文件夹管理并保存路径到数据库

在实际开发,我们的文件是保存到服务器硬盘上,而文件的地址是存在数据库里
在实际开发,文件的存放是有专门的服务器,文件服务器
1.修改index.jsp
在这里插入图片描述
2.创建数据库并集成ssm
在这里插入图片描述
1,导包
2,修改applicaiton-dao.xml
3,修改applicaiton-service.xml
4,修改applicaitonContext.xml
5,修改web.xml
3.创建Attachment
在这里插入图片描述
4.创建AttachmentMapper
在这里插入图片描述
5.创建AttachmentMapper.xml
生成的
6.创建AttachmentVo
在这里插入图片描述
7.创建AttachmentService
在这里插入图片描述
8.创建AttachmentServiceIpml
在这里插入图片描述
9.创建AttachmentController


/**
 * 文件管理控制器
 * @author LJH
 *
 */
@Controller
@RequestMapping("attachment")
public class AttachmentController {
	
	@Autowired
	private AttachmentService attachmentService;
	/**
	 * 文件上传改名并分文件夹管理
	 */
	@RequestMapping("addAttachment")
	public String addAttachment(MultipartFile mf,HttpSession session){
		//1,得到文件上传的目录
		String realPath=session.getServletContext().getRealPath("/upload");
		//2,得到文件夹的名字
		String dirName=RandomUtils.createDirNameUserDate();
		//3,构造文件夹对象
		File dirFile=new File(realPath,dirName);
		//4,判断文件夹是否存在
		if(!dirFile.exists()){
			dirFile.mkdirs();//创建文件夹
		}
		//5,得到文件名
		String oldName=mf.getOriginalFilename();
		//6,生成新的文件名
		String newName=RandomUtils.createFileNameUseTime(oldName);
		//7,构造文件对象
		File file=new File(dirFile, newName);
		//5,上传文件
		try {
			mf.transferTo(file);
			AttachmentVo attachmentVo=new AttachmentVo();
			attachmentVo.setFoldname(oldName);
			attachmentVo.setFcontenttype(mf.getContentType());
			attachmentVo.setFcreatetime(new Date());
			attachmentVo.setFsize(Double.valueOf(mf.getSize()));
			//存放相对路径
			attachmentVo.setFpath("upload/"+dirName+"/"+newName);
			//说明文件上传成功
			attachmentService.addAttachment(attachmentVo);
		} catch (IllegalStateException | IOException e) {
			e.printStackTrace();
		}
		return "success";
	}
}

7.查询文件列表

1.修改index.jsp
在这里插入图片描述

2.修改AttachmentController
在这里插入图片描述
3.修改AttachmentService
在这里插入图片描述
4.修改AttachmentServiceImpl
在这里插入图片描述
5.修改AttachmentMapper
在这里插入图片描述
6.修改AttachmentMapper.xml
在这里插入图片描述

7.创建WEB-INF/view/list.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>文件列表</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
</head>

<body>
	<h1>
		所有文件
	</h1>
	<hr>
	<table border="1" width="100%" cellpadding="5" cellspacing="5">
		<tr>
			<th>编号</th>
			<th>老名字</th>
			<th>上传时间</th>
			<th>文件大小</th>
			<th width="30%">文件类型</th>
			<th>操作</th>
		</tr>
		<c:forEach var="sn" items="${list }">
			<tr>
				<td align="center">${sn.fid }</td>
				<td align="center">${sn.foldname }</td>
				<td align="center">
					<fmt:formatDate value="${sn.fcreatetime }" pattern="yyyy-MM-dd HH:mm:ss"/>
				</td>
				<td align="center">${sn.fsize }</td>
				<td align="center">${sn.fcontenttype }</td>
				<td align="center">
					<a href="">下载1</a>||
					<a href="">下载2</a>
				</td>
			</tr>
		</c:forEach>
	</table>
</html>

在这里插入图片描述

8.文件下载

下载方式
	1,直接使用路径下载
			|--优点:不能写后台代码
			|--缺点:丢失了文件老名字
					暴露了文件在服务器里面的路径
	2,使用后台下载
			|--优点:可以显示文件老名字  隐藏了文件在服务器的路径
			|--缺点:要写代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值