java实现上传和下载工具类

yizhihongxing

当我们需要在Java程序中实现文件上传和下载的功能时,可以采用Java的IO类来实现。下面是实现上传和下载功能的步骤。

1. 上传文件

1.1 上传文件的前端HTML页面

在上传文件的前端页面中,我们需要使用到input标签和form标签。如下所示:

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

其中,action属性指定上传的路径,method属性指定请求的方法为POST,enctype属性指定表单的 MIME 类型为multipart/form-data。

1.2 实现文件上传的后端Java程序

我们可以使用Java的IO类来完成文件上传功能。如下所示:

@RequestMapping(value = "/upload", method = RequestMethod.POST, produces = "text/plain;charset=UTF-8")
@ResponseBody
public String upload(HttpServletRequest request) {
    try {
        // 获取上传文件的流和文件名
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        MultipartFile file = multipartRequest.getFile("file");
        String fileName = file.getOriginalFilename();
        // 设置上传文件的路径
        String filePath = "path/";

        // 开始上传文件
        InputStream inputStream = file.getInputStream();
        FileOutputStream fileOutputStream = new FileOutputStream(filePath + fileName);
        byte[] buffer = new byte[1024];
        int length = 0;
        while ((length = inputStream.read(buffer)) > 0) {
            fileOutputStream.write(buffer, 0, length);
        }

        fileOutputStream.close();
        inputStream.close();

        return "上传成功!";
    } catch (Exception e) {
        return "上传失败!";
    }
}

首先,我们要在Controller类中加上@RequestMapping注解来指定请求的 URL 和方法类型。该方法的参数为 HttpServletRequest,可以通过该参数获取上传的文件流和文件名。然后指定上传文件的路径,并根据文件名创建一个新的文件。最后,不断读取上传文件的流,并将读取到的内容写到新创建的文件中。

2. 下载文件

2.1 下载文件的前端HTML页面

在下载文件的前端页面中,我们需要使用到HTML的a标签,并在标签的href属性中指定要下载的文件路径。如下所示:

<a href="/download/file" download="file">Download</a>

其中,href属性指定要下载的文件路径,download属性指定下载文件的名称。

2.2 实现文件下载的后端Java程序

我们也可以使用Java的IO类来完成文件下载功能。如下所示:

@RequestMapping("/download/{fileName}")
public ResponseEntity<byte[]> download(@PathVariable("fileName") String fileName) throws IOException {
    File file = new File("path/" + fileName);
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    headers.setContentDispositionFormData("attachment", fileName);
    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
}

使用 @RequestMapping 注解指定请求的 URL,方法中的 @PathVariable 注解用于获取 URL 中的参数。然后使用 Java 的 IO 类读取文件,并通过 ResponseEntity 将文件以流的形式返回给客户端。其中,headers.setContentType(MediaType.APPLICATION_OCTET_STREAM) 用于指定返回的文件类型,headers.setContentDispositionFormData("attachment", fileName) 用于设置下载文件的名称。

示例1:实现通过Java上传文件到FTP服务器中

public class FtpUtil {
    private String ftpHost = "***";
    private String ftpUserName = "***";
    private String ftpPassword = "***";
    private int ftpPort = 21;
    private String ftpPath = "/";

    public FtpUtil() {
    }

    /**
     * 上传文件
     *
     * @param fileName 文件名称
     * @param input    文件流
     * @return boolean
     */
    public boolean uploadFile(String fileName, InputStream input) {
        boolean success = false;
        FTPClient ftp = new FTPClient();
        ftp.setControlEncoding("GBK");
        try {
            int reply;
            ftp.connect(ftpHost, ftpPort);
            ftp.login(ftpUserName, ftpPassword);
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return success;
            }
            ftp.enterLocalPassiveMode();
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            if (!ftp.changeWorkingDirectory(ftpPath)) {
                ftp.makeDirectory(ftpPath);
                ftp.changeWorkingDirectory(ftpPath);
            }
            if (ftp.storeFile(fileName, input)) {
                success = true;
            }
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return success;
    }
}

示例2:实现通过Java从FTP服务器中下载文件到本地

public class FTPUtil {
    private static final String FTP_ADDRESS = "***";
    private static final String FTP_PORT = "***";
    private static final String FTP_USERNAME = "***";
    private static final String FTP_PASSWORD = "***";
    private static final String FTP_BASEPATH = "***";

    /**
     * 从FTP服务器下载文件
     *
     * @param localPath  下载至本地的路径
     * @param remotePath FTP服务器中文件的路径
     * @param fileName   文件名称
     * @return boolean
     */
    public static boolean downloadFile(String localPath, String remotePath, String fileName) {
        boolean success = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(FTP_ADDRESS, Integer.parseInt(FTP_PORT));
            ftp.login(FTP_USERNAME, FTP_PASSWORD);
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return success;
            }
            ftp.changeWorkingDirectory(FTP_BASEPATH);
            ftp.enterLocalPassiveMode();
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            File localFile = new File(localPath + File.separatorChar + fileName);
            OutputStream os = new FileOutputStream(localFile);
            if (ftp.retrieveFile(remotePath + fileName, os)) {
                success = true;
            }
            os.close();
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return success;
    }
}

这两个示例展示了在Java程序中实现上传和下载文件的两种方式。第一个示例演示了如何通过Java程序将文件上传到FTP服务器中,第二个示例演示了如何通过 Java 程序从 FTP 服务器中下载文件到本地。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现上传和下载工具类 - Python技术站

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

相关文章

  • 一文详解JAVA中InputStreamReader流

    一、概述 InputStreamReader是Java中的输入流,是字符流与字节流之间的桥梁。它将字节流转换为字符流,以便于阅读和操作。 二、用法 InputStreamReader的用法非常简单,只需要创建一个InputStreamReader实例,并且为其传入一个输入流,然后就可以操作输入流中的字符了。 示例代码如下: try { InputStream…

    Java 2023年5月20日
    00
  • Spring MVC拦截器_动力节点Java学院整理

    以下是关于“Spring MVC拦截器_动力节点Java学院整理”的完整攻略,其中包含两个示例。 Spring MVC拦截器 Spring MVC拦截器是一种用于拦截请求和响应的机制。在本文中,我们将讲解Spring MVC拦截器的实现原理及用法。 拦截器实现原理 Spring MVC拦截器的实现原理是通过实现HandlerInterceptor接口来实现的…

    Java 2023年5月17日
    00
  • SpringMVC整合SSM实现表现层数据封装详解

    SpringMVC整合SSM实现表现层数据封装详解 在Web应用程序中,表现层数据封装是非常重要的,它可以帮助我们将请求参数封装成Java对象,方便我们在控制器中进行处理。本文将详细介绍如何使用SpringMVC整合SSM实现表现层数据封装,并提供两个示例说明。 步骤1:创建Maven项目 首先,我们需要在IDEA中创建一个Maven项目。在创建项目时,我们…

    Java 2023年5月17日
    00
  • Android之网络通信案例分析

    Android之网络通信案例分析 本文将为大家详细介绍如何在Android应用中实现网络通信,主要内容包括: Android的网络通信模块介绍; HttpUrlConnection工具类详细讲解和使用方法; okhttp工具类详细讲解和使用方法; Retrofit库详细讲解和使用方法; Volley库详细讲解和使用方法。 一、Android的网络通信模块介绍…

    Java 2023年5月23日
    00
  • Hibernate批量处理海量数据的方法

    下面是详细讲解Hibernate批量处理海量数据的方法的完整攻略: 前言 在企业级应用程序中,通常需要处理大量的数据,而批量数据处理更是必不可少的一环。Hibernate提供了各种机制来批量处理海量的数据。下面我们将详细介绍这些机制以及如何使用它们来处理大量的数据。 Session缓存 为什么需要Session缓存 Session缓存是Hibernate中非…

    Java 2023年5月20日
    00
  • Java项目开启远程调试的方法步骤(tomcat、springboot)

    当我们遇到 Java 项目中出现奇怪的问题时,远程调试是一种非常有用的方法,它可以帮助我们定位问题并解决它。在这里,我们将讨论如何在 Tomcat 和 Spring Boot 中开启 Java 项目的远程调试。 开启 Tomcat 远程调试 步骤 1:修改 Tomcat 启动脚本 找到你的 Tomcat 安装路径下的 bin 目录,打开 catalina.s…

    Java 2023年5月19日
    00
  • Maven pom.xml与settings.xml详解

    Maven是一个流行的Java构建工具,是基于项目对象模型(Project Object Model, POM)进行构建的。POM是一个XML文件,描述了项目的依赖关系、构建环境、代码目录、打包、部署等信息。POM通过继承机制实现了依赖管理和构建配置的复用,是Maven强大的特性之一。而settings.xml是Maven的配置文件,它包含了Maven的配置…

    Java 2023年5月20日
    00
  • Java程序执行Cmd指令所遇问题记录及解决方案

    Java程序执行Cmd指令所遇问题记录及解决方案 在Java程序中执行Cmd指令时,可能会遇到一些问题,本文将对这些问题进行详细的记录和解决方案的说明。 问题1:Cmd指令执行结果输出不完整 在Java程序中执行Cmd指令时,有时候会发现输出结果不完整,只输出了部分内容。这是由于Cmd指令的输出是通过缓冲区实现的,当输出的内容超过缓冲区的大小时,就会出现输出…

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