Javaweb之实现文件上传+点击下载功能【奔跑吧!JAVA】

网友投稿 812 2022-05-29

Javaweb之实现文件上传+点击下载功能

实现目标:

Javaweb之实现文件上传+点击下载功能【奔跑吧!JAVA】

1、编写index.jsp,可以进行文件上传

2、上传成功后跳回index.jsp,并把上传的文件名显示在index.jsp中(用a标签显示)。

3、点击文件名,可下载文件

准备工具:

IntelliJ IDEA 2019.2.3 x64

apache-tomcat-8.5.15

JSP 标准标签库(JSTL)

首先,简单编写Index,jsp的上传页面

<%-- Created by IntelliJ IDEA. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> upload && download //enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。 //不对字符编码。在使用包含文件上传控件的表单时,必须使用该值

再来编写UploadServlet.java的实现上传的IO

package com.blb.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; import java.io.*; import java.nio.file.Path; //支持二进制处理 @MultipartConfig @WebServlet("/upload") //映射路径 public class UploadServlet extends HttpServlet { String path="d:/upload/"; //上传的路径 这里我设置的是d盘的upload文件夹下 @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Part file = req.getPart("file"); //获取提交的文件名 String fileName = file.getSubmittedFileName(); //获取文件的输入流 InputStream inputStream = file.getInputStream(); //获取的文件传到path路径 FileOutputStream fileOutputStream = new FileOutputStream(path+fileName); byte[] data = new byte[1024]; int len; while ((len=inputStream.read(data))!=-1){ // 表示从InputStream中读取一个数组的数据,如果返回-1 则表示数据读取完成了。 fileOutputStream.write(data,0,len); //循环读取数据 } inputStream.close(); fileOutputStream.close(); //关闭IO流 } }

检查一下,没什么错误,试着看看效果

选择一个图片文件

点击上传后

检查D:/upload下是否有这个文件

证明咱们这个逻辑没问题哈,已经能实现上传到指定路径了

接着实现上传成功后跳回index.jsp,并把上传的文件名显示在index.jsp中(用a标签显示)。

这里先导入一个jstl的jsp

一定要在WEB-INF下导入,然后右键jstl选择 as a libray

导入完成后在jsp头部加入一个引入标签,然后在主体里加入forEach遍历这个上传的文件list 显示在浏览器的页面上

<%-- Created by IntelliJ IDEA. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> //jstl引入标签

文件列表

${file}
//上传文件的名字的显示在a标签内

接着写实现点击a标签下载上传后的文件的功能代码DownloadServlet.java

package com.blb.servlet; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.ws.Service; import java.io.FileInputStream; import java.io.IOException; @MultipartConfig @WebServlet("/download") public class DownloadServlet extends HttpServlet { String path="D:/"; @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //要下载的文件名 String file = req.getParameter("file"); //取得文件输入流 FileInputStream fileInputStream = new FileInputStream(path + file); //获得输出流 ServletOutputStream outputStream = resp.getOutputStream(); //将文件名转码 String fileName = new String(file.getBytes(), "iso-8859-1"); resp.setContentType("application/octet-stream"); //告诉浏览器我这是一个二进制文件 resp.setHeader("Content-Disposition", "attachment;filename=" + fileName); //告诉浏览器文件名是什么 resp.setContentLength(fileInputStream.available()); //告诉浏览器文件的大小是多少 //IO流写操作,向客户端写内容 byte[] data = new byte[1024]; int len; while ((len=fileInputStream.read(data))!=-1){ outputStream.write(data, 0, len); } fileInputStream.close(); outputStream.close(); } }

接着来试试效果

nice,基本的效果都已经实现了,但是还是要优化之处,比如:

1、阅读IOUtis,把读写操作进行封装起来方便调用

package com.blb.utils; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; public class IOUtils { /** * 输入输出流读取操作封装 * @param inputStream * @param outputStream * @throws IOException */ public static void readAndWriter(InputStream inputStream, OutputStream outputStream) throws IOException { byte[] data = new byte[1024]; int len; while ((len=inputStream.read(data))!=-1){ outputStream.write(data, 0, len); } inputStream.close(); outputStream.close(); } /** * 下载配置 * @param resp * @param file * @param length * @throws UnsupportedEncodingException */ public static void downloadConfig(HttpServletResponse resp, String file, int length) throws UnsupportedEncodingException { String fileName = new String(file.getBytes(), "iso-8859-1"); resp.setContentType("application/octet-stream"); resp.setContentLength(length); resp.setHeader("Content-Disposition", "attachment;filename=" + fileName ); } }

2、下载前先判断文件是否存在

在DownloadServlet里添加如下代码:

if (!file1.exists()) { req.setAttribute("msg", "文件不存在"); req.getRequestDispatcher("index.jsp").forward(req, resp); return; } //判断文件是否存在

然后在index.jsp里加一个绑定数据${msg}实现传递

文件列表

${msg} ${file}

3、服务器重启后,文件列表丢失问题

第一次进来时,文件列表不能正常显示问题

package com.blb.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; @WebServlet("/index") public class IndexServlet extends HttpServlet { // String path = "D:/upload/"; @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { File dir = new File("D:/upload/"); String[] list = dir.list(); //把存放文件名集合的list放到session作用域中 req.getSession().setAttribute("files", list); resp.sendRedirect("index.jsp"); //重定向 } }

最后的最后,这个小项目到这里结束了,欢迎大家指正!!

【奔跑吧!JAVA】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/265241

Java web前端

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《学习OpenCV 3(中文版)》 — 第一个程序:显示图片
下一篇:93_JavaWeb_JS1_变量_数组_函数_object
相关文章