java实现上传和下载工具类

当我们需要在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中print、printf、println的区别

    浅析Java中print、printf、println的区别 概述 在Java编程中,我们经常需要在程序中输出信息。而输出信息的方式,主要有三种:print、printf、println。这三种方式虽然非常相似,但是却有着不同的用途和输出效果。本文将详细分析它们之间的区别。 print print是最常用的输出语句之一,用于输出字符串和变量的值。它的使用语法…

    Java 2023年5月26日
    00
  • cmd中javac和java使用及注意事项详解

    当我们需要开发Java程序时,需要使用到JDK提供的工具 javac 和 java。其中 javac 是用于编译Java源代码生成二进制字节码文件,而 java 则是用于运行已经编译好的二进制字节码文件,下面详细介绍一下在cmd中使用javac和java的方法及注意事项。 1. 安装JDK并配置环境变量 在使用javac和java之前,首先需要安装JDK并配…

    Java 2023年5月23日
    00
  • Springboot启动扩展点超详细教程小结

    Spring Boot启动扩展点是Spring Boot提供的一种机制,可以在Spring Boot启动过程中执行自定义的逻辑。以下是一个完整的Spring Boot启动扩展点攻略,包括如何创建和使用Spring Boot启动扩展点。 创建Spring Boot启动扩展点 我们可以通过实现org.springframework.boot.SpringAppl…

    Java 2023年5月14日
    00
  • Java编程学习的几个典型实例详解

    Java编程学习的几个典型实例详解 如果你正在学习Java编程,建立几个典型的实例并深入研究它们是帮助你更好理解Java的重要步骤之一。 下面是一些你可以跟随的Java编程实例: 实例一:图书馆管理系统 图书馆管理系统是您可以实现的最典型的Java编程实例之一。在这个系统中,您需要设计一个完整的图书馆信息管理系统,包括添加、删除、修改图书馆书本的信息,检索书…

    Java 2023年5月19日
    00
  • java中URLEncoder.encode与URLDecoder.decode处理url特殊参数的方法

    下面是 Java 中 URLEncode 和 URLDecode 处理 URL 特殊参数的完整攻略。 URLEncode 和 URLDecode 概述 在 URL 中,有一些字符是有特殊意义的,例如问号、等号、百分号等,如果要在 URL 中传递这些特殊字符,需要进行编码和解码操作,否则会导致 URL 出现错误。 URLEncode 操作就是将传入的字符串进行…

    Java 2023年5月20日
    00
  • 什么是即时编译(AOT)?

    即时编译(AOT)是指在程序运行前将源代码编译成机器码。不同于传统的预编译,AOT编译是在程序运行前进行编译的,可以将程序的执行效率提高。 下面是AOT的完整使用攻略: 1. AOT的原理 AOT编译是将程序源代码在编译时生成机器码。在程序运行时,不需要再进行编译,可以直接运行机器码,从而提高程序的运行效率。 2. AOT的使用方式 AOT编译在不同语言和平…

    Java 2023年5月11日
    00
  • Spring boot整合security详解

    Spring Boot整合Security详解 Spring Security是一个功能强大的安全框架,可以帮助我们保护Web应用程序。Spring Boot提供了与Spring Security的无缝集成,本文将详细介绍如何使用Spring Boot整合Security,并提供两个示例。 添加依赖 首先,我们需要在pom.xml文件中添加Spring Se…

    Java 2023年5月15日
    00
  • Java之Jackson使用案例详解

    Java之Jackson使用案例详解 Jackson是Java中最流行的JSON序列化和反序列化库之一,它提供了轻量级快速、灵活的JSON处理方式。本文将详细讲解在Java中如何使用Jackson进行JSON序列化和反序列化。内容如下: 简介 在Java中使用Jackson进行JSON处理时,可以使用以下依赖: <!– Jackson核心模块 –&…

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