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日

相关文章

  • 【Jmeter】按比例分配Api压测

    先看 【Jmeter】基础介绍-详细 【Jmeter】Request1输出作为Request2输入-后置处理器 继续聊提出的第二个问题,即   2.需要按比例分配API请求并发,以模拟真实的API压力场景 做压测的时候,一般的需求都是多个API同时压,不然也看不出真正的tps是多少啊。 比如虽然接口a的需求并发不高,500个用户才请求一次,但是特别耗性能,导…

    Java 2023年4月25日
    00
  • 用intellij Idea加载eclipse的maven项目全流程(图文)

    以下是详细讲解“用IntelliJ Idea加载Eclipse的Maven项目全流程”的完整攻略。 步骤1:安装IntelliJ Idea 首先,需要在本地安装IntelliJ Idea,如果还没有安装,请官网下载并安装。 步骤2:打开IntelliJ Idea 安装完成后,打开IntelliJ Idea,点击菜单中的“Import Project” 步骤3…

    Java 2023年5月20日
    00
  • Java实现的时间戳与date对象相互转换功能示例

    以下是“Java实现的时间戳与date对象相互转换功能示例”的攻略: 1. 使用Date对象实现时间戳与日期字符串的相互转换 1.1 时间戳转日期字符串 import java.text.SimpleDateFormat; import java.util.Date; public class TimestampToDateStr { public stat…

    Java 2023年5月20日
    00
  • Java——对象初始化顺序使用详解

    Java——对象初始化顺序使用详解 在Java中,对象初始化的顺序非常重要,因为它直接影响程序的行为以及可能导致程序出现一些难以调试的错误。本文将详细讲解Java中对象初始化的顺序及其使用注意事项。 对象初始化顺序 当一个Java对象被创建时,其成员变量会被初始化为其对应的初始值。但是,如果类中包含了静态块、静态变量、实例块、实例变量、构造函数等初始化代码,…

    Java 2023年5月26日
    00
  • springboot项目中jackson-序列化-处理 NULL教程

    安装Jackson依赖 在 Spring Boot 项目中使用 Jackson 进行数据序列化和反序列化时,需要先在项目中添加 Jackson依赖。 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-da…

    Java 2023年5月26日
    00
  • Java4Android开发教程(一)JDK安装与配置

    Java4Android开发教程(一)JDK安装与配置 在进行Java4Android开发之前,需要先安装和配置JDK(Java Development Kit),本文将介绍如何安装和配置JDK。 1. 下载JDK 首先,需要到Oracle官网下载JDK,下载地址为https://www.oracle.com/java/technologies/javase…

    Java 2023年5月24日
    00
  • springMVC拦截器HandlerInterceptor用法代码示例

    下面详细讲解一下“springMVC拦截器HandlerInterceptor用法代码示例”的完整攻略。 什么是HandlerInterceptor? HandlerInterceptor是Spring MVC框架的拦截器,用于在controller处理请求之前和之后进行一些额外的处理。HandlerInterceptor是一个接口,需要自定义实现它,并将其…

    Java 2023年5月31日
    00
  • IDEA + Maven环境下的SSM框架整合及搭建过程

    IDEA + Maven环境下的SSM框架整合及搭建过程 前言 本篇攻略将详细介绍在 IDEA + Maven 环境下如何搭建 SSM 框架,其中 SSM 框架指的是 Spring + SpringMVC + MyBatis 框架。本攻略包含以下内容: 环境准备 Maven 配置文件编写 SSM 项目创建 SSM 核心配置文件编写 SSM 数据库操作示例 希…

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