java文件上传下载功能实现代码

yizhihongxing

Java文件上传下载是Web开发中常见的功能,实现代码一般基于Servlet或Spring MVC等框架。下面是实现Java文件上传下载功能的完整攻略,包含示例代码。

1. 文件上传

Java文件上传一般需要使用表单提交,数据由客户端通过HTTP POST请求发送到服务器。客户端可以使用HTML表单或JavaScript+FormData等方式实现。服务端接收到数据后,可以使用Java I/O流等方式将文件保存到指定目录。

1.1 HTML表单方式上传文件

HTML表单中通过元素实现文件选择功能,提交表单时,浏览器会将文件数据包装成multipart/form-data编码格式,发送到服务器。服务端接收到表单提交的数据后,通过request.getParameter()方法无法获取文件数据,需要通过request.getPart()方法获取文件Part对象,进一步操作。

示例代码:

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>文件上传HTML表单</title>
</head>
<body>
    <form action="fileUploadServlet" method="post" enctype="multipart/form-data">
        <label for="file">选择文件:</label>
        <input type="file" name="file" id="file" /><br />
        <input type="submit" value="上传" />
    </form>
</body>
</html>
@WebServlet("/fileUploadServlet")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        Part filePart = request.getPart("file"); // 获取文件Part对象
        String fileName = filePart.getSubmittedFileName(); // 获取文件名
        InputStream fileContent = filePart.getInputStream(); // 获取文件输入流

        String uploadPath = request.getServletContext().getRealPath("/uploads"); // 上传文件保存目录
        File uploadDir = new File(uploadPath);
        if(!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        File savedFile = new File(uploadDir, fileName);
        try(BufferedInputStream bis = new BufferedInputStream(fileContent);
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(savedFile));) {
            byte[] buffer = new byte[1024];
            int len;
            while((len = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, len);
            }
        }

        response.getWriter().println("文件上传成功!");
    }
}

1.2 JavaScript+FormData方式上传文件

JavaScript+FormData方式上传文件相对于HTML表单方式具有更好的兼容性和灵活性。通过FormData对象将表单数据提交到服务器,能够同时上传多个文件和其他数据。

示例代码:

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>文件上传JavaScript方式</title>
</head>
<body>
    <input type="file" id="file" /><br />
    <button onclick="uploadFile()">上传</button>
    <script>
        function uploadFile() {
            var files = document.getElementById('file').files;
            var formData = new FormData();
            for(var i = 0; i < files.length; i++) {
                formData.append('file', files[i]);
            }
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function() {
                if(xhr.readyState == 4 && xhr.status == 200) {
                    alert(xhr.responseText);
                }
            }
            xhr.open('POST', 'fileUploadServlet', true);
            xhr.send(formData);
        }
    </script>
</body>
</html>
@WebServlet("/fileUploadServlet")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        Collection<Part> fileParts = request.getParts(); // 获取所有上传文件Part对象
        String uploadPath = request.getServletContext().getRealPath("/uploads"); // 上传文件保存目录
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        for (Part filePart : fileParts) {
            if (filePart.getSubmittedFileName() == null) {
                continue; // 忽略非文件Part对象
            }
            String fileName = filePart.getSubmittedFileName(); // 获取文件名
            InputStream fileContent = filePart.getInputStream(); // 获取文件输入流
            File savedFile = new File(uploadDir, fileName);
            try (BufferedInputStream bis = new BufferedInputStream(fileContent);
                    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(savedFile));) {
                byte[] buffer = new byte[1024];
                int len;
                while ((len = bis.read(buffer)) != -1) {
                    bos.write(buffer, 0, len);
                }
            }
            response.getWriter().println("文件" + fileName + "上传成功!<br />");
        }
    }
}

2. 文件下载

Java文件下载一般需要使用HTTP响应方式实现,客户端通过链接、按钮等方式发送下载请求。服务端将文件数据以application/octet-stream或特定格式的MIME类型形式发送到客户端,客户端会根据响应头中的Content-Disposition属性将文件保存到本地。

2.1 通过Servlet实现文件下载

使用Servlet实现文件下载相对于普通的HTTP服务器具有更好的可定制性和扩展性。可以通过Servlet过滤器或权限控制等方式增加安全性。

示例代码:

@WebServlet("/fileDownloadServlet")
public class FileDownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename=file.txt");

        String filePath = getServletContext().getRealPath("/downloads"); // 下载文件路径
        File downloadFile = new File(filePath, "file.txt");
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(downloadFile));
                BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());) {
            byte[] buffer = new byte[1024];
            int len;
            while ((len = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, len);
            }
        }
    }
}

2.2 通过SpringMVC实现文件下载

使用SpringMVC框架相对于Servlet更加简洁便捷。可以通过ResponseEntity类型返回文件数据及响应头信息。

示例代码:

@GetMapping("/fileDownload")
public ResponseEntity<byte[]> fileDownload() throws IOException {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    headers.setContentDispositionFormData("attachment", "file.txt");

    String filePath = servletContext.getRealPath("/downloads"); // 下载文件路径
    File downloadFile = new File(filePath, "file.txt");
    byte[] data = Files.readAllBytes(downloadFile.toPath());

    return new ResponseEntity<byte[]>(data, headers, HttpStatus.OK);
}

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

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 浅谈Java springboot日志管理

    浅谈Java Spring Boot日志管理 作为 Java 程序员,我们使用日志来记录程序运行过程中的状态信息和错误信息。Spring Boot 提供了使用很方便的日志处理方式。在本文中,我们将介绍如何在 Spring Boot 项目中管理日志。 添加日志依赖 Spring Boot 自带日志框架,常用的是 logback 和 log4j2。如果你想使用其…

    Java 2023年5月19日
    00
  • Spring Boot深入分析讲解日期时间处理

    Spring Boot深入分析讲解日期时间处理 导言 在Spring Boot应用中,常常需要处理日期时间。本文将介绍Java针对日期时间的处理方式,并重点介绍了Spring Boot提供的日期时间处理方式。 Java日期时间处理 Java提供了两套日期时间处理方式: java.util.Date和java.util.Calendar java.time提供…

    Java 2023年5月20日
    00
  • Layer弹出层动态获取数据的方法

    Layer弹出层是一款基于jQuery的Web弹出组件,它具有美观、易用、功能强大的特点。在开发时,可能需要在弹出层中展示动态获取的数据。本攻略将详细说明“Layer弹出层动态获取数据的方法”。 步骤1:引入jQuery库和layer.js文件 Layer弹出层组件基于jQuery,使用前需要先确认页面中已经引入了jQuery库,以便后续使用。 <!-…

    Java 2023年6月16日
    00
  • java开发之Jdbc分页源码详解

    首先,我们需要了解JDBC分页的概念,它可以帮助我们在处理大量数据时,避免一次性获取过多的数据,从而提高程序的性能。 下面是一个基于JDBC的分页实现的示例代码,供您参考: import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement;…

    Java 2023年6月16日
    00
  • Java8 新特性Lambda表达式实例详解

    Java8 新特性Lambda表达式实例详解 Java8 新特性Lambda表达式,是一个非常强大的工具。它可以让我们编写出更加简洁清晰易懂的代码,并且大大提高了代码编写的效率。在本文中,我将详细讲解Lambda表达式的语法和使用方法,并通过两个实例帮助您更好地理解这个新特性。 Lambda表达式的语法 Lambda表达式的语法非常简单,它由三个部分构成:参…

    Java 2023年5月26日
    00
  • JDBC Template基本使用方法详解

    JDBC Template基本使用方法详解 JDBC Template简介 JDBC(Java Database Connectivity)是一个Java语言访问数据库的接口,JDBC Template是使用JDBC进行数据库操作的常用工具类,该类能够自动化处理资源申请、资源释放等常规流程,并提供了诸如CRUD、批量操作、分页查询等常用数据库操作方法,使用J…

    Java 2023年6月16日
    00
  • java后端把数据转换为树,map递归生成json树,返回给前端(后台转换)

    首先,需要明确一下这个过程的流程和目的:将后端获得的数据转换为树形结构,再通过递归生成 JSON 树,并返回给前端。下面我们将详细讲解这个过程。 1. 将数据转换为树形结构 首先,需要将后端的数据进行转换,变成树形结构。可以使用递归来完成这个过程。 具体实现方式如下:首先,定义一个树节点的类 Node,包含节点名称、节点编号、父节点编号、节点类型等属性。然后…

    Java 2023年5月26日
    00
  • hibernate4基本配置方式详解

    Hibernate 4 基本配置方式详解 什么是 Hibernate Hibernate 是一个优秀的 Java ORM(Object Relational Mapping)框架,能够将 Java 对象和数据库中的表进行映射,从而使数据库操作更加方便。Hibernate 的特点是面向对象、透明、高性能和可移植性好。 Hibernate 配置方式 Hibern…

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