Java实现的文件上传下载工具类完整实例【上传文件自动命名】

这里是Java实现的文件上传下载工具类完整实例【上传文件自动命名】的完整攻略。

1. 实现思路

文件上传下载是Web开发中非常常见的需求,Java提供了丰富的API和工具来实现文件上传下载的功能。这个工具类的实现思路如下:

  • 文件上传:通过Servlet规范提供的HttpServletRequest对象获取上传文件,将上传文件保存到指定目录中,并返回文件保存路径和文件名。
  • 文件下载:通过Servlet规范提供的HttpServletResponse对象将服务器上的文件输出到浏览器,实现文件下载。

在文件上传过程中,为了避免文件名冲突,可以通过自动命名的方式给上传文件命名。本例中用UUID作为文件名,保证文件名唯一。

2. 代码实现

具体实现时需要添加依赖项,本例所需依赖项为:

  • commons-fileupload:用于处理文件上传。
  • commons-io:提供对文件和流的实用操作。

首先,我们需要创建一个工具类FileUtil,该工具类提供了文件上传和下载两个方法。

package com.example.demo.util;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

public class FileUtil {

    /**
     * 上传文件
     *
     * @param request     HttpServletRequest对象
     * @param uploadPath  上传文件保存的目录
     * @param allowedType 允许上传的文件类型
     * @param maxFileSize 允许上传的最大文件大小,单位为字节
     * @return 上传文件保存的路径和文件名,例如:/uploads/42f61985-28a7-4707-a8c3-8d23d6e8afc0.jpg
     * @throws Exception 如果上传文件失败则抛出异常
     */
    public static String upload(HttpServletRequest request, String uploadPath, String[] allowedType, long maxFileSize) throws Exception {
        // 如果上传的是多个文件,使用下面的代码
        /*List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
        for (FileItem item : items) {
            if (!item.isFormField()) { // 如果是文件字段
                String fileName = item.getName(); // 获取上传文件的文件名
                if (fileName != null && !fileName.isEmpty()) {
                    File uploadedFile = new File(uploadPath, fileName);
                    item.write(uploadedFile);
                    return uploadedFile.getPath();
                }
            }
        }*/

        // 如果上传的是单个文件,使用下面的代码
        if (ServletFileUpload.isMultipartContent(request)) { // 判断是否是multipart/form-data类型的表单
            DiskFileItemFactory factory = new DiskFileItemFactory();
            factory.setSizeThreshold(1024 * 1024); // 设置缓冲区大小,这里是1MB
            factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); // 设置临时文件保存的目录,这里使用系统默认的目录

            ServletFileUpload uploader = new ServletFileUpload(factory);
            uploader.setFileSizeMax(maxFileSize); // 设置允许上传的最大文件大小
            uploader.setSizeMax(10 * maxFileSize); // 设置允许上传的总文件大小

            String fileName = null;
            InputStream is = null;
            OutputStream os = null;
            try {
                FileItem item = uploader.parseRequest(request).get(0); // 获取上传的文件
                fileName = item.getName(); // 获取上传文件的文件名
                is = item.getInputStream(); // 获取上传文件的输入流
                if (fileName != null && !fileName.isEmpty()) {
                    // 如果文件夹不存在,则创建文件夹
                    File uploadDir = new File(uploadPath);
                    if (!uploadDir.exists()) {
                        uploadDir.mkdir();
                    }
                    // 自动生成文件名
                    fileName = generateFileName(fileName);
                    File uploadedFile = new File(uploadDir.getPath() + File.separator + fileName);
                    os = new FileOutputStream(uploadedFile);
                    IOUtils.copy(is, os); // 将上传文件复制到服务器上
                    return uploadedFile.getPath();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                IOUtils.closeQuietly(is); // 关闭输入流,释放资源
                IOUtils.closeQuietly(os); // 关闭输出流,释放资源
            }
        }
        return null;
    }

    /**
     * 生成新文件名
     *
     * @param oldFileName 原文件名
     * @return 新文件名
     */
    private static String generateFileName(String oldFileName) {
        String suffix = oldFileName.substring(oldFileName.lastIndexOf("."));
        String uuid = UUID.randomUUID().toString();
        return uuid + suffix;
    }

    /**
     * 下载文件
     *
     * @param filePath   文件路径
     * @param response   HttpServletResponse对象
     * @param isDownload 是否需要下载,如果为false,则直接在浏览器中打开文件
     * @throws Exception 如果下载文件失败则抛出异常
     */
    public static void download(String filePath, HttpServletResponse response, boolean isDownload) throws Exception {
        // 获取文件
        File file = new File(filePath);
        if (!file.exists()) {
            response.sendError(404, "File not found!");
            return;
        }
        String fileName = file.getName();

        // 设置Content-Type
        String contentType = getContentType(fileName);
        response.setContentType(contentType);

        // 设置Content-Disposition
        if (isDownload) { // 下载文件
            String contentDisposition = "attachment;filename=\"" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1") + "\"";
            response.setHeader("Content-Disposition", contentDisposition);
        } else { // 在浏览器中打开文件
            String contentDisposition = "inline;filename=\"" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1") + "\"";
            response.setHeader("Content-Disposition", contentDisposition);
        }

        // 将文件输出到浏览器
        InputStream is = null;
        OutputStream os = null;
        try {
            is = new FileInputStream(file);
            os = response.getOutputStream();
            IOUtils.copy(is, os);
            response.flushBuffer();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(is); // 关闭输入流,释放资源
            IOUtils.closeQuietly(os); // 关闭输出流,释放资源
        }
    }

    /**
     * 获取Content-Type
     *
     * @param fileName 文件名
     * @return 文件对应的Content-Type
     */
    private static String getContentType(String fileName) {
        String contentType = "application/octet-stream";
        String ext = fileName.substring(fileName.lastIndexOf("."));
        if (".txt".equalsIgnoreCase(ext)) {
            contentType = "text/plain";
        } else if (".doc".equalsIgnoreCase(ext) || ".docx".equalsIgnoreCase(ext)) {
            contentType = "application/msword";
        } else if (".xls".equalsIgnoreCase(ext) || ".xlsx".equalsIgnoreCase(ext)) {
            contentType = "application/vnd.ms-excel";
        } else if (".ppt".equalsIgnoreCase(ext) || ".pptx".equalsIgnoreCase(ext)) {
            contentType = "application/vnd.ms-powerpoint";
        } else if (".pdf".equalsIgnoreCase(ext)) {
            contentType = "application/pdf";
        } else if (".jpg".equalsIgnoreCase(ext) || ".jpeg".equalsIgnoreCase(ext)) {
            contentType = "image/jpeg";
        } else if (".png".equalsIgnoreCase(ext)) {
            contentType = "image/png";
        } else if (".gif".equalsIgnoreCase(ext)) {
            contentType = "image/gif";
        }
        return contentType;
    }

}

接下来,我们使用FileUtil工具类来实现文件上传和下载。

2.1 文件上传示例

下面的示例演示了如何使用FileUtil工具类将文件上传到服务器,并返回文件保存的路径和文件名。

package com.example.demo.controller;

import com.example.demo.util.FileUtil;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;

@RestController
public class FileUploadController {

    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        try {
            String[] allowedType = {"image/jpeg", "image/png"}; // 允许上传的文件类型
            long maxFileSize = 10 * 1024 * 1024; // 允许上传的最大文件大小,这里是10MB
            String uploadPath = request.getServletContext().getRealPath("/uploads");
            String filePath = FileUtil.upload(request, uploadPath, allowedType, maxFileSize);
            return "File uploaded successfully: " + filePath;
        } catch (Exception e) {
            e.printStackTrace();
            return "File uploaded failed.";
        }
    }

}

2.2 文件下载示例

下面的示例演示了如何使用FileUtil工具类从服务器下载文件。

package com.example.demo.controller;

import com.example.demo.util.FileUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;

@RestController
public class FileDownloadController {

    @GetMapping("/download/{fileName}")
    public void download(@PathVariable("fileName") String fileName, @RequestParam(value = "isDownload", required = false, defaultValue = "true") boolean isDownload, HttpServletResponse response) {
        try {
            String filePath = "/path/to/uploads/" + fileName;
            FileUtil.download(filePath, response, isDownload);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

以上就是Java实现的文件上传下载工具类完整实例【上传文件自动命名】的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现的文件上传下载工具类完整实例【上传文件自动命名】 - Python技术站

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

相关文章

  • ANGULARJS中用NG-BIND指令实现单向绑定的例子

    下面我将详细讲解关于 ANGULARJS 中使用 ng-bind 指令实现单向绑定的攻略,主要分为以下几个方面。 什么是 ng-bind 指令? ng-bind 是 ANGULARJS 框架中用于将数据值绑定到 HTML 元素中的指令,它用于在模板中动态绑定数据,可以通过变化自动更新绑定数据的值,实现实时更新数据,具体用法如下: <div ng-bin…

    Java 2023年6月15日
    00
  • Java的Struts框架报错“NullSubscriptionException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“NullSubscriptionException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置,则可能会出现此错误。在这种情况下,需要检查文件以解决此问题。 订阅名称:如果订阅名称不正确,则可能出现此错误。在这种情况下,需要检查订阅名称以解决此问题。 以下是两个实例: 例 1 如…

    Java 2023年5月5日
    00
  • Java的递归算法详解

    Java的递归算法详解 什么是递归算法? 递归算法是指在函数中调用自身实现的一种算法思想。使用递归可以大大简化代码实现,提高代码可读性和代码质量。 递归算法的特点 递归算法需要有边界条件(也称为递归结束条件),以避免无限循环调用自身而导致栈溢出等问题。 递归算法要求问题能够分解成与原问题同类型的子问题,且子问题的求解可以通过递归调用自身来实现。 递归算法在实…

    Java 2023年5月19日
    00
  • 浅析JAVA中过滤器、监听器、拦截器的区别

    下面开始详细讲解“浅析JAVA中过滤器、监听器、拦截器的区别”的完整攻略。 概述 在Java Web开发中,过滤器、监听器、拦截器都是常用的三种组件,它们的作用都是在服务器接收请求和响应之间加入某种特性。虽然它们的功能有些相似,但它们的实现和应用场景又有所不同。 过滤器(Filter) 过滤器是在请求链中,对请求和响应进行预处理和后处理的组件。过滤器可以拦截…

    Java 2023年5月20日
    00
  • Spring Boot Admin的使用详解(Actuator监控接口)

    当我们在使用 Spring Boot 构建 web 应用时,使用 Actuator 来监控应用程序状态和执行度量非常有用。但 Actuator 提供的 JSON API 数据对于非技术人员来说很难直接理解。此时,Spring Boot Admin 就是一个非常好的选择,它提供了一个图形化的用户界面,用于监控 Spring Boot 应用程序。 本文将介绍如何…

    Java 2023年5月20日
    00
  • SpringBoot自定义/error路径失效的解决

    下面是对于“SpringBoot自定义/error路径失效的解决”的完整攻略: 背景 在使用SpringBoot开发web应用的过程中,我们有时需要自定义error处理页面。按照惯例,我们可以将静态页面放在/resources/static/error路径下,然后在Controller层中自定义处理对应的erroCode,比如404、500等。这样,当用户访…

    Java 2023年5月26日
    00
  • Spring Boot如何使用JDBC获取相关的数据详解

    下面是关于“Spring Boot如何使用JDBC获取相关的数据详解”的完整攻略。 1. 添加JDBC依赖 在Spring Boot项目中使用JDBC,需要在pom.xml文件中添加相应的依赖。在本示例中,我们使用MySQL数据库,因此需要添加以下依赖: <dependency> <groupId>mysql</groupId&…

    Java 2023年5月20日
    00
  • Java tomcat环境变量及idea配置解析

    Java Tomcat是JSP/Servlet的运行环境,它是一个开源的Web服务器,支持Java语言开发的Web应用程序。搭建Java Tomcat环境需要进行相关的环境变量配置和IDEA配置,下面就来详细讲解一下: 一、环境变量配置 安装Java JDK 首先需要安装Java JDK,然后将Java JDK的安装路径添加到系统环境变量中。以Windows…

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