JavaWeb实现文件上传下载功能实例解析

JavaWeb实现文件上传下载功能实例解析

一、文件上传

文件上传是指将本地机器上的文件通过网络传输到远程服务器上的过程。在JavaWeb中,可以使用Servlet实现文件上传功能。

在上传文件之前,需要先创建一个表单,让用户选择需要上传的文件。具体操作如下:

  1. 在HTML中创建一个表单,指定表单的enctype属性值为"multipart/form-data",表单中包含一个file类型的input元素:
<form action="uploadServlet" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="上传">
</form>
  1. 在Servlet中处理上传的文件。获取上传的文件需要使用到requset.getParts()方法。该方法返回一个Part的集合,我们可以使用for循环对其中的每个Part进行处理。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");

    Collection<Part> parts = request.getParts();
    for (Part part : parts) {
        String fileName = getFileName(part);
        if (fileName != null && !"".equals(fileName)) {
            part.write("D:/" + fileName); // 将上传的文件保存到D盘目录下
        }
    }
}

private String getFileName(Part part) {
    String contentDisposition = part.getHeader("Content-Disposition");
    if (contentDisposition == null) {
        return null;
    }
    String[] attrs = contentDisposition.split(";");
    for (String attr : attrs) {
        if (attr.trim().startsWith("filename=")) {
            return attr.substring(attr.indexOf('=') + 1).trim().replace("\"", "");
        }
    }
    return null;
}

二、文件下载

文件下载是指将服务器上的文件发送到客户端,让客户端可以下载到本地机器上。在JavaWeb中,可以使用Servlet实现文件下载功能。

在下载文件之前,需要先在Servlet中指定要下载的文件,并将该文件的InputStream中的数据写入到ServletOutputStream中,最后发送给客户端即可。具体操作如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String filePath = "D:/test.txt"; // 下载的文件路径
    File file = new File(filePath);
    if (!file.exists()) {
        response.sendError(HttpServletResponse.SC_NOT_FOUND);
        return;
    }

    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;
    try {
        bis = new BufferedInputStream(new FileInputStream(file));
        bos = new BufferedOutputStream(response.getOutputStream());
        byte[] buffer = new byte[1024];
        int len;
        while ((len = bis.read(buffer)) != -1) {
            bos.write(buffer, 0, len);
        }
    } finally {
        if (bis != null) {
            bis.close();
        }
        if (bos != null) {
            bos.close();
        }
    }
}

以上是JavaWeb实现文件上传下载功能的完整攻略,以下是两个实用的案例:

示例1:上传图片,并将图片展示在页面上

HTML代码

<form action="uploadServlet" method="post" enctype="multipart/form-data">
    <input type="file" name="image" accept="image/png, image/jpeg, image/gif">
    <input type="submit" value="上传">
</form>

<!-- 展示图片 -->
<img src="">

<script>
    // 图片上传成功后,将该图片展示在页面上
    function handleFile() {
        var file = document.querySelector('input[type=file]').files[0];
        var reader = new FileReader();
        reader.onload = function(event) {
            document.querySelector('img').setAttribute('src', event.target.result);
        };
        reader.readAsDataURL(file);
    }
    document.querySelector('input[type=file]').addEventListener('change', handleFile);
</script>

Servlet代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Collection<Part> parts = request.getParts();
    for (Part part : parts) {
        if ("image".equals(part.getName())) {
            String fileName = getFileName(part);
            if (fileName != null && !"".equals(fileName)) {
                part.write("D:/" + fileName); // 将上传的图片保存到D盘目录下
                String imageUrl = "/images/" + fileName;
                response.getWriter().write(imageUrl);
            }
        }
    }
}

private String getFileName(Part part) {
    String contentDisposition = part.getHeader("Content-Disposition");
    if (contentDisposition == null) {
        return null;
    }
    String[] attrs = contentDisposition.split(";");
    for (String attr : attrs) {
        if (attr.trim().startsWith("filename=")) {
            return attr.substring(attr.indexOf('=') + 1).trim().replace("\"", "");
        }
    }
    return null;
}

示例2:下载文件并限制下载速度

Servlet代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String filePath = "D:/test.pdf"; // 下载的文件路径
    File file = new File(filePath);
    if (!file.exists()) {
        response.sendError(HttpServletResponse.SC_NOT_FOUND);
        return;
    }

    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));

    // 控制下载速度
    response.setBufferSize(4096); // 每次读取的字节数
    long fileSize = file.length(); // 文件总大小
    long start = 0;
    long end = fileSize - 1;
    String range = request.getHeader("Range");
    if (range != null && range.matches("^bytes=\\d*-\\d*$")) {
        String[] bytes = range.substring(6).split("-");
        start = Long.parseLong(bytes[0]);
        end = Long.parseLong(bytes.length > 1 && !"".equals(bytes[1]) ? bytes[1] : (fileSize - 1) + "");
        response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
    }
    response.setHeader("Content-Range", "bytes " + start + "-" + end + "/" + fileSize);

    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;
    try {
        bis = new BufferedInputStream(new FileInputStream(file));
        bis.skip(start);
        bos = new BufferedOutputStream(response.getOutputStream());
        byte[] buffer = new byte[4096];
        long length = end - start + 1;
        int len;
        long count = 0;
        long time = System.currentTimeMillis();
        while ((len = bis.read(buffer)) != -1) {
            bos.write(buffer, 0, len);
            count += len;
            if (count >= length) {
                break;
            }
            long nowTime = System.currentTimeMillis();
            if (nowTime - time >= 1000) {
                synchronized (this) {
                    try {
                        wait(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                time = nowTime;
            }
        }
    } finally {
        if (bis != null) {
            bis.close();
        }
        if (bos != null) {
            bos.close();
        }
    }
}

其中,通过设置response的BufferSize属性来控制每次读取的字节数,在循环读取文件内容时,控制每秒输出文件的字节数来控制下载速度,使用synchronized来防止CPU瞎忙。

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

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

相关文章

  • JavaSpringBoot报错“PessimisticLockingFailureException”的原因和处理方法

    当使用Java的Spring Boot框架时,可能会遇到“OptimisticLockingFailureException”和“PessimisticLockingFailureException”错误。这些错误通常是由以下原因之一引起的: 乐观锁或悲观锁失败:如果使用乐观锁或悲观锁时失败,则可能会出现这些错误。在这种情况下,需要查找锁失败的原因并解决它。…

    Java 2023年5月5日
    00
  • Maven中pom.xml配置文件详细介绍

    Maven 是 Java 项目中管理项目构建、依赖管理、打包、发布等方面非常优秀的工具。pom.xml 是 Maven 建立项目的核心文件,它可以用来描述项目相关的各种元素。本攻略将详细讲解 pom.xml 配置文件的各个部分及其对 Maven 项目的影响,希望能为 Maven 初学者提供帮助。 1. 项目基本信息 首先,打开 pom.xml 文件,你会看到…

    Java 2023年5月20日
    00
  • Mybatis-Plus主键生成策略的方法

    关于Mybatis-Plus主键生成策略的方法,我们来一步步讲解。 什么是Mybatis-Plus主键生成策略 首先,让我们了解一下Mybatis-Plus是什么。Mybatis-Plus是一个Mybatis的增强工具,提供了很多强大的功能,包括自动生成代码、通用CRUD操作、分页插件等等。而Mybatis-Plus主键生成策略就是Mybatis-Plus提…

    Java 2023年5月19日
    00
  • 动态字节码生成的作用是什么?

    动态字节码生成是指在程序运行过程中动态生成字节码的一种技术。它可以让程序在运行时动态地生成类,方法和字段等内容,而不必像静态代码一样事先写好保存在文件中。这种技术最常见的使用场景是实现动态代理、AOP(面向切面编程)等功能。以下是动态字节码生成的使用攻略。 步骤一:引入相关库 使用动态字节码生成技术需要引入相关的库,下面是两种常用的库: ASM:ASM是Ja…

    Java 2023年5月11日
    00
  • 基于springMvc+hibernate的web application的构建

    下面是关于基于Spring MVC和Hibernate的Web应用程序构建的完整攻略,包含两个示例说明。 基于Spring MVC和Hibernate的Web应用程序构建 Spring MVC和Hibernate是Java Web应用程序开发中常用的框架。在本文中,我们将介绍如何使用这两个框架来构建一个Web应用程序。 步骤1:添加依赖 首先,我们需要在po…

    Java 2023年5月17日
    00
  • java分布式面试系统限流最佳实践

    针对Java分布式面试系统的限流最佳实践,我将分享以下攻略: 1. 需求调研与场景分析 首先,你需要了解你的系统在什么场景下存在限流的需求,例如有哪些接口需要限流、在什么情况下需要限流等等。在这个阶段中,你需要和业务对接人员进行沟通,了解产品的最大承载量、是否需要分区以及不同区之间的流量比例等。 2. 选择限流算法 常见的限流算法有令牌桶算法、漏桶算法以及计…

    Java 2023年5月24日
    00
  • 搭建MyBatis开发环境及基本的CURD介绍

    关于搭建MyBatis开发环境以及基本的CURD介绍,我们需要以下几步: 安装 Java SE环境 首先需要在本地安装好Java SE环境,通常使用官网提供的JDK安装包进行安装,安装完毕之后可以使用 java -version 命令查看安装是否成功。 安装和配置 Maven Maven是一个Java项目管理工具,可以方便地管理Java项目中的依赖关系和构建…

    Java 2023年6月2日
    00
  • JavaScript修改注册表实例代码

    为避免不必要的风险和系统异常,建议不要随意修改注册表,如果您一定要进行此类操作,请务必备份您的注册表并谨慎操作。 以下是基于JavaScript修改注册表的攻略: 1. 确定注册表操作范围 在 JavaScript 中,我们可以使用 WScript 对象来修改注册表。但是,WScript 对象可能会对计算机系统的性能、稳定性和安全性产生不良影响。建议对于系统…

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