详解JavaWeb如何实现文件上传和下载功能

让我为您详细讲解“详解JavaWeb如何实现文件上传和下载功能”的完整攻略。

1. 文件上传功能的实现

1.1 准备工作

首先需要在web.xml中添加文件上传所需的过滤器和Servlet:

<!-- 文件上传过滤器 -->
<filter>
    <filter-name>uploadFilter</filter-name>
    <filter-class>org.apache.commons.fileupload.servlet.ServletFileUpload</filter-class>
    <init-param>
        <param-name>fileUploadThresholdSize</param-name>
        <param-value>10240</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>uploadFilter</filter-name>
    <servlet-name>uploadServlet</servlet-name>
</filter-mapping>

<!-- 文件上传Servlet -->
<servlet>
    <servlet-name>uploadServlet</servlet-name>
    <servlet-class>com.example.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>uploadServlet</servlet-name>
    <url-pattern>/upload</url-pattern>
</servlet-mapping>

还需要添加文件上传所需的依赖,比如apache-commons系列。

1.2 代码编写

接下来需要编写文件上传的Servlet类,代码如下:

@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    private static final String TMP_DIR_PATH = "/tmp";
    private static final String DESTINATION_DIR_PATH = "/uploads";

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 判断是否是文件上传表单
        if (ServletFileUpload.isMultipartContent(request)) {
            // 创建文件上传工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            factory.setSizeThreshold(1024 * 1024); // 设置缓冲区大小(默认是10KB)

            // 设置临时文件夹
            File tmpDir = new File(TMP_DIR_PATH);
            if (!tmpDir.exists()) {
                tmpDir.mkdirs();
            }
            factory.setRepository(tmpDir);

            // 创建文件上传器
            ServletFileUpload uploader = new ServletFileUpload(factory);
            uploader.setHeaderEncoding("UTF-8"); // 设置请求头编码
            uploader.setSizeMax(1024 * 1024 * 10); // 设置上传文件的最大大小(默认是1MB)

            // 设置上传文件的保存路径
            File destinationDir = new File(getServletContext().getRealPath(DESTINATION_DIR_PATH));
            if (!destinationDir.exists()) {
                destinationDir.mkdirs(); // 如果目标文件夹不存在,则创建之
            }

            try {
                // 解析Request请求
                List<FileItem> items = uploader.parseRequest(request);
                for (FileItem item : items) {
                    if (!item.isFormField()) { // 如果不是普通表单域
                        String itemName = item.getName();
                        // 保存文件(注意:需要对文件名进行处理,去掉路径等)
                        String filePath = destinationDir.getAbsolutePath() + "/" + itemName;
                        item.write(new File(filePath));
                    }
                }
                response.getWriter().write("文件上传成功!");
            } catch (Exception e) {
                response.getWriter().write("文件上传失败!" + e.getMessage());
            }
        } else {
            response.getWriter().write("不是文件上传表单!");
        }
    }
}

最后只需要编写一个上传文件的表单即可:

<form action="upload" method="POST" enctype="multipart/form-data">
    <input type="file" name="file"/>
    <input type="submit" value="上传"/>
</form>

1.3 实验验证

在项目中新建一个JSP页面,放置一个文件上传表单,上传一个文件并查看上传后文件的存储路径和文件名称是否正确。

2. 文件下载功能的实现

2.1 准备工作

和文件上传功能一样,需要在web.xml中添加文件下载所需的Servlet:

<servlet>
    <servlet-name>downloadServlet</servlet-name>
    <servlet-class>com.example.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>downloadServlet</servlet-name>
    <url-pattern>/download</url-pattern>
</servlet-mapping>

2.2 代码编写

接下来需要编写文件下载的Servlet类,代码如下:

@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
    private static final String DESTINATION_DIR_PATH = "/uploads";

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取要下载的文件名
        String fileName = request.getParameter("name");
        if (fileName == null || fileName.isEmpty()) {
            response.getWriter().write("文件名不能为空!");
            return;
        }

        // 设置文件下载ContentType
        response.setContentType("application/octet-stream");
        // 设置Content-Disposition,让浏览器下载该文件
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);

        // 获取要下载的文件路径
        String filePath = getServletContext().getRealPath(DESTINATION_DIR_PATH) + "/" + fileName;
        File file = new File(filePath);
        if (!file.exists()) {
            response.getWriter().write("文件不存在!");
            return;
        }

        // 下载文件
        FileInputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(file);
            out = response.getOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
        } catch (Exception e) {
            response.getWriter().write("文件下载失败!" + e.getMessage());
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

最后只需要在点击下载按钮时向后台发送一个GET请求,同时将文件名作为参数传递给Servlet即可:

<a href="download?name=filename">下载文件</a>

2.3 实验验证

在项目中新建一个JSP页面,放置一个文件下载按钮,下载一个已经上传的文件并查看下载后文件的名称是否正确。

以上就是“详解JavaWeb如何实现文件上传和下载功能”的完整攻略,希望可以帮助您实现这两个功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JavaWeb如何实现文件上传和下载功能 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • MyBatis Plus构建一个简单的项目的实现

    MyBatis Plus构建一个简单的项目攻略 MyBatis Plus 简化了MyBatis的操作,可以快速构建一个简单的项目。本攻略将带你从创建项目,到配置MyBatis Plus及其插件、编写实体类、mapper接口和service层代码,最终完成一个简单的CRUD操作。 以下为该攻略的具体步骤: 1. 创建项目 使用maven创建一个简单的Sprin…

    Java 2023年5月20日
    00
  • Spring Security 自动踢掉前一个登录用户的实现代码

    当一个用户已经登录了系统,但是另一个用户使用相同的账号登录时,为了安全起见,一般需要自动踢掉前一个用户。Spring Security 为开发者提供了一些较为方便且易于理解的方式来实现这个功能。 基于SessionRegistry来实现 Spring Security提供了SessionRegistry来帮助我们管理用户的Session,我们可以使用这个类来…

    Java 2023年5月20日
    00
  • JSP JavaBean的setProperty属性

    下面是关于JSP JavaBean的setProperty属性的完整攻略。 什么是JSP JavaBean的setProperty属性? JSP JavaBean的setProperty属性,是指在JSP页面中,对JavaBean的属性进行设置的操作。使用setProperty属性,可以在JSP页面中为JavaBean的属性赋值,并更新JavaBean中属性…

    Java 2023年6月15日
    00
  • Java中的LinkageError是什么?

    LinkageError在Java中是一种错误类型,指的是Class文件在链接阶段出现的错误,可能是缺少需要链接的类或类库、重复加载相同的类库等因素导致。 Java中的LinkageError包括四种类型: VerifyError:在class文件验证阶段出现错误,也就是说,在编译后、在类加载过程中,Java虚拟机会验证class文件的正确性,如果出现问题,…

    Java 2023年4月27日
    00
  • SpringBoot 中实现跨域的5种方式小结

    下面是实现Spring Boot中跨域的5种方式的详细攻略: 1. Spring Boot官方文档提供的方式 在Spring Boot官方文档中提供了一个全局配置方式,只需要在配置文件application.properties中添加以下一行配置即可: spring.mvc.cors.allowed-origins=* 这种方式的实现比较简单,适合跨域要求不…

    Java 2023年5月15日
    00
  • 解决mybatis-plus 查询耗时慢的问题

    当使用MyBatis-Plus进行查询时,如果存在查询耗时慢的问题,我们可以通过以下方式进行优化: 1. 添加索引优化 在进行查询时,若存在大表或多表关联的情况,可以考虑通过添加索引来优化查询速度。具体可以通过以下方式操作: 1.1. 加速索引扫描 当查询条件中包含索引列时,MySQL会尝试使用索引扫描,但当行数非常大时,索引扫描比全表扫描更慢。此时可以通过…

    Java 2023年6月16日
    00
  • 深入浅析Centos 7系统的Tomcat服务器

    深入浅析Centos 7系统的Tomcat服务器 简介 Tomcat 是 Apache 软件基金会(Apache Software Foundation)的一款开源的 Java Servlet 容器,也是一个标准的 JSP 容器。 本文将分步讲解如何在 Centos 7 系统上安装和配置 Tomcat 服务器,以及如何在 Tomcat 中部署网站应用。 安装…

    Java 2023年5月19日
    00
  • spring boot集成pagehelper(两种方式)

    下面我会详细讲解Spring Boot集成PageHelper的两种方式及相应的示例。 方式一:使用PageHelper Starter 第一步:在pom.xml文件中添加以下依赖: <dependency> <groupId>com.github.pagehelper</groupId> <artifactId&g…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部