什么是文件上传
本质上就是用IO流进行文件从客户端(浏览器)存储到服务器,不将数据直接存储到数据库中,而是要将数据存储到服务器所在的磁盘上,这就要使用文件上传。
为什么使用文件上传
将客户端的文件保存到服务器磁盘,减少数据库的压力
jsp
<form action="/file/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<button>上传文件</button>
</form><br>
设置form表单nethod属性post,防止携带信息暴露在路径上
enctype属性设置为multipart/form-data,用于上传文件
input type属性声明为file 文件类型
Java
service方法体
//同过请求获取文件
Part file = req.getPart("file");
//从客户端传来的文件获取I流
InputStream in = file.getInputStream();
//获取文件名
String fileName = file.getSubmittedFileName();
//创建File对象 文件存入的目录
File file1 = new File("D:/upload/" );
//创建O流对象
FileOutputStream ou = new FileOutputStream(file1.getPath() +"/"+ fileName);
//IO流进行文件传输
byte[] bytes = new byte[102400];
while (true){
int len = in.read(bytes);
if (len == -1)
break;
ou.write(bytes,0,len);
}
ou.close();
in.close();
什么是文件下载
既然文件长传是浏览器上传服务器,那下载就是将服务器端的资源通过io流写回到浏览器端
为什么要文件下载
因为用户需要这个文件
jsp页面
<c:forEach items="${list}" var="file">
<a href="/file/down?name=${file}">${file}</a><br>
</c:forEach>
多个文件时通过foeanch循环携带不同的文件名(file)去servlet层 创建IO流
使用 c:forEach 时要导个包
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
JAVA
String name = req.getParameter("name");
User user = SessionUtils.getUser(req);
FileInputStream in = new FileInputStream("D:/upload/" + user.getName()+ "/" + name);
ServletOutputStream ou = resp.getOutputStream();
//获取文件大小
int len = in.available();
//告诉浏览器类型是二进制
resp.setContentType("application/octet-stream");
//告诉浏览器文件名
resp.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(name,"UTF8"));
//告诉浏览器文件大小
resp.setContentLength(len);
//IO流文件传输和上面一样,被封装成方法了
Ioutils.readAndWrite(in,ou);
resp.sendRedirect("/user/index");
上传和下载的区别除了目录问题就是
- 设置文件以二进制传输否则浏览器会直接打开文件
- 设置文件名,否则浏览器会以默认的文件名下载
- 设置浏览器文件大小,会显示进度条