一 上传和下载
01 上传操作
1、方案一
要求:
前端页面: form 表单的要求: 1、提交方式必须是 post 提交。 2、需要指定表单的类型 enctype="multipart/form-data" 3、需要指定 input 标签的 type="file" name="xxx" 后端实现: Servlet 当中的实现 1、在Servlet当中需要指定注解 @MultipartConfig 2、获取到 part 的值, 采用请求进行获取 Part p =req.getPart("xxx"); 3、写数据到指定路径 p.write("路径");
代码:
位置 web/upload/upload01.jsp
<%--
http://localhost:8080/JavaWebDay21/upload/upload01.jsp
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传版本1</title>
</head>
<body>
<h1> 文件上传版本1 - Part 原始版本 </h1>
<form
method="post"
enctype="multipart/form-data"
action="${pageContext.request.contextPath}/UpLoad01Servlet">
<input type="text" name="username" placeholder="普通文本"> <br>
<input type="file" name="upfile" placeholder="选择你需要上传的文件"> <br>
<input type="submit" value="提交数据到服务器">
</form>
</body>
</html>
位置: src/blb.chc02.UpLoad01Servlet
/***
* 强调: 这里需要加上注解 @MultipartConfig 表示支持 part提交的方式
*/
@WebServlet("/UpLoad01Servlet")
@MultipartConfig
public class UpLoad01Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("UpLoad01Servlet.doGet");
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("UpLoad01Servlet.doPost");
//获取到数据,获取到普通文本框的数据
String username = req.getParameter("username");
System.out.println("username = " + username);
//获取到文件的数据。文件需要通过 getPart("xxx") 获取
Part p = req.getPart("upfile");
//获取到文件的名称
String fileName = p.getSubmittedFileName();
//获取到准备存放文件的路径
String path = req.getServletContext().getRealPath("/");
System.out.println("path = " + path);
//准备写数据
p.write(path + "/" + fileName);
}
}
2、方案二
要求:
前端页面: form 表单的要求: 1、提交方式必须是 post 提交。 2、需要指定表单的类型 enctype="multipart/form-data" 3、需要指定 input 标签的 type="file" name="xxx" 后端实现: 导入两个 jar 包: 1、commons-fileupload-1.3.1.jar 2、commons-io-2.4.jar Servlet 当中的实现 1、在Servlet当中操作流程: A. 磁盘工厂 DiskFileItemFactory B. 上传文件对象 ServletFileUpload C. 表单项集合 List<FileItem> 2、对集合进行遍历,获取得到FileItem A. 判断是否是 普通的文本输入框 fileItem.isFormField() B. 判断是否不为 普通文本输入框,那么就是 上传的输入框
代码:
位置 web/upload/upload02.jsp
<%--
http://localhost:8080/JavaWebDay21/upload/upload02.jsp
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传版本2</title>
</head>
<body>
<h1> 文件上传版本2 - FileUpload 版本 </h1>
<form
method="post"
enctype="multipart/form-data"
action="${pageContext.request.contextPath}/UpLoad02Servlet">
<input type="text" name="username" placeholder="普通文本"> <br>
<input type="file" name="upfile" placeholder="选择你需要上传的文件"> <br>
<input type="submit" value="提交数据到服务器">
</form>
</body>
</html>
位置 src/blb.chc02.UpLoad02Servlet
02 下载操作
1、方案一
要求:
前端页面: 可以使用超链接,完成下载的功能。 1、直接在超链接上面添加 download 属性,就可以完成下载。同时还可以指定下载的文件名称 2、如果当前的超链接标签,不能被浏览器解析,则直接判定为下载的操作
代码:
位置 web/download/download01.jsp
@WebServlet("/UpLoad02Servlet")
public class UpLoad02Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("UpLoad02Servlet.doGet");
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("UpLoad02Servlet.doPost");
try {
//定义一个普通的方法,用于接收请求和响应,作为文件上传的操作
upload(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
//自己定义的文件上传的方法,这里可能存在异常,为了让大家看代码更加舒服一点
protected void upload(HttpServletRequest req, HttpServletResponse resp) throws Exception {
//判断一下,是否是文件上传的表单, 如果不是文件上传的类型,则直接返回
if (!ServletFileUpload.isMultipartContent(req)) {
return;
}
//流程: 磁盘工厂 DiskFileItemFactory --> 上传文件对象 ServletFileUpload --> 表单集合 List<FileItem>
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload load = new ServletFileUpload(factory);
List<FileItem> fileItems = load.parseRequest(req);
//针对于集合,进行循环遍历
for (FileItem item : fileItems) {
//判断当前的类型是否是普通文本类型,只有两种类型:1、普通文本,2、文件类型 type="file"
if (item.isFormField()) {
//如果是普通文本类型,只需要得到键和和值
String name = item.getFieldName();
String value = item.getString("UTF-8");
System.out.println(name + " = " + value);
}else{
//如果是文件的类型,需要得到文件的名称
String name = item.getName();
//准备上传的路径,上传文件之后,保存文件的路径
String path = req.getServletContext().getRealPath("/");
System.out.println("path = " + path);
//创建文件的对象
File f = new File(path,name);
//存放文件
item.write(f);
}
}
}
}
02 下载操作
1、方案一
要求:
前端页面: 可以使用超链接,完成下载的功能。 1、直接在超链接上面添加 download 属性,就可以完成下载。同时还可以指定下载的文件名称 2、如果当前的超链接标签,不能被浏览器解析,则直接判定为下载的操作
代码:
位置 web/download/download01.jsp
<%--
http://localhost:8080/JavaWebDay21/download/download01.jsp
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>下载的操作-超链接完成下载</title>
</head>
<body>
<h1> 超链接完成下载功能 </h1>
<h3> 展示界面 </h3>
如果不能正常解析的文件,则直接判定为下载。<br><hr>
<a href="face.png"> 展示图片 </a> <br>
<a href="hello.txt"> 展示文本 </a> <br>
<a href="Demo.zip"> 展示压缩包,无法解析则下载 </a> <br>
<a href="chui.mp3"> 展示音乐 </a> <br>
<h3> 下载界面 </h3>
指定 download属性可以实现下载,如果想要指定名称,则指定download的属性值。<br><hr>
<a href="face.png" download> 下载图片 </a> <br>
<a href="hello.txt" download>下载文本 </a> <br>
<a href="Demo.zip"> 下载压缩包 </a> <br>
<a href="chui.mp3" download="大风吹.mp3"> 下载音乐 </a> <br>
</body>
</html>
2、方案二
要求:后端页面:
直接响应一段浏览器无法识别的操作,浏览器会自动帮我们下载。可以去设置响应头的信息。
1、设置响应头信息:
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition","attachement;filename="+filename);
2、采用IO流读写数据
FileInputStream is = new FileInputStream("路径或者对象");
ServletOutputStream os = response.getOutputStream();
代码:
位置 web/download/download02.jsp
<%--
http://localhost:8080/JavaWebDay21/download/download02.jsp
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>采用后端代码完成下载</title>
</head>
<body>
<h1>后端代码完成下载功能</h1>
文件列表信息如下:
<ul>
<li> chui.mp3 </li>
<li> Demo.zip </li>
<li> face.png </li>
<li> hello.txt </li>
</ul>
<form method="get" action="${pageContext.request.contextPath}/DownLoad02Servlet">
<input type="text" name="filename" placeholder="请输入上述的文件名称">
<input type="submit" value="提交则完成下载">
</form>
</body>
</html>
位置:src/blb.chc03.DownLoad02Servlet
@WebServlet("/DownLoad02Servlet")
public class DownLoad02Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("DownLoad02Servlet.doGet");
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("DownLoad02Servlet.doPost");
//可以获取到请求的参数
String filename = req.getParameter("filename");
//可以获取到资源文件的路径
String path = req.getServletContext().getRealPath("/download");
//封装成为File对象
File f = new File(path,filename);
//判断文件如果不存在,则直接返回
if (!f.exists()){
System.out.println("文件不存在... "+f);
return;
}
//如果文件存在,则响应文件到浏览器当中
resp.setContentType("application/x-msdownload");
resp.setHeader("Content-Disposition","attachement;filename="+filename);
//获取流对象
FileInputStream is = new FileInputStream(f);
ServletOutputStream os = resp.getOutputStream();
//读写操作
byte[] array = new byte[1024];
int len;
while ((len = is.read(array))!=-1){
os.write(array,0,len);
os.flush();
}
//释放资源
os.close();
is.close();
}
}