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

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日

相关文章

  • mybatis使用foreach遍历list集合或者array数组方式

    下面我将详细讲解使用MyBatis的foreach遍历list集合或者array数组的方法。 1. foreach遍历list集合 1.1 准备工作 首先,我们需要在mapper接口中定义一个方法,参数为List类型,如下所示: public interface UserMapper { List<User> getUsersByIds(List…

    Java 2023年5月26日
    00
  • Java中的Lambda详细解读

    Lambda是JDK1.8新引进的简化代码语法格式,可以替代原先的匿名内部类,lambda写法只能实现接口的方法,不能用于实现抽象类实现。 //以下代码对比一下两者写法上的区别 interface Alarm{ void display(); } public class Lambda{ public static void main(String[] ar…

    Java 2023年4月27日
    00
  • Java8深入学习之熟透Optional

    Java8深入学习之熟透Optional Java8引入了Optional类型,用于解决空指针异常问题。本文将深入讲解Optional的使用,并提供完整攻略,以帮助读者更好地使用和理解Optional。 什么是Optional? Optional是Java8引入的一个容器(Container)对象,用于处理空指针异常。它可以包含一个非null的对象,也可以为…

    Java 2023年5月26日
    00
  • JS+DIV+CSS实现仿表单下拉列表效果

    下面是JS+DIV+CSS实现仿表单下拉列表效果的完整攻略: 一、实现思路 在HTML中定义一个表单元素 使用CSS美化表单元素的样式 使用JavaScript控制下拉列表的显示与隐藏,并将选中的值显示到表单元素中 二、具体实现步骤 1. HTML结构 在HTML中定义一个表单元素,并使用div元素模拟下拉列表的选项: <div class=&quot…

    Java 2023年6月15日
    00
  • SpringMVC框架如何与Junit整合看这个就够了

    SpringMVC框架如何与Junit整合 本文将详细讲解如何使用Junit测试SpringMVC框架,并提供两个示例说明。 环境准备 在开始整合Junit和SpringMVC框架之前,我们需要准备以下环境: JDK 18或以上版本 Maven 3.6.3或以上版本 Tomcat 9.0或以上版本 Junit 5.7.2或以上版本 实现步骤 下面是整合Jun…

    Java 2023年5月17日
    00
  • Java ORM的作用是什么?

    Java ORM(Object-Relational Mapping)是一种将对象和关系型数据库映射起来实现数据持久化的技术。ORM框架使得开发人员能够使用对象来访问和操作数据库,而不用关注底层的SQL语句和数据库操作细节,从而提高了开发效率和代码质量。 ORM的作用主要有以下几点: 简化数据库操作:ORM框架提供了ORM映射机制,可以将Java对象映射到数…

    Java 2023年5月11日
    00
  • 全面解析SpringBoot自动配置的实现原理

    全面解析Spring Boot自动配置的实现原理 Spring Boot是一个流行的Java Web框架,它提供了自动配置的功能,可以帮助我们快速搭建Web应用程序。本文将介绍Spring Boot自动配置的实现原理,包括自动配置的启动过程、自动配置的实现原理、自动配置的优先级和自动配置的排除等。同时,我们还提供了两个示例,演示了如何使用Spring Boo…

    Java 2023年5月14日
    00
  • Apache Shiro 使用手册(五) Shiro 配置说明

    下面是 Apache Shiro 使用手册(五) Shiro 配置说明 的完整攻略: 概述 本文将详细介绍 Apache Shiro 的配置方式,包括常见的配置项和配置文件的使用方法。通过本文的学习,你将能够快速上手 Apache Shiro 的配置工作。 常见配置项 SecurityManager 在 Apache Shiro 中,SecurityMana…

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