项目中上传文件工具类FileUtil的使用及其介绍

本文将介绍在项目中使用的FileUtil工具类,包括其如何创建、使用及内部实现的关键功能。通过实例展示FileUtil在处理文件上传过程中的重要作用,帮助读者理解和掌握此类在实际开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先创建一个存放参数的类 Constants

package com.example.demo.util;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Constants {
    // 系统变量
 
    // 线上 linux
    public static final String COMPUTER_USER_NAME = "/root";
    public static final String UPLOAD_DIRECTORY = "upload";
    // windows
    public static final String DRIVE_LETTER = "D";


}

工具类FileUtil

package com.example.demo.util;

import org.apache.tika.mime.MimeTypeException;
import org.apache.tika.mime.MimeTypes;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FileUtil {

    public static boolean isWindows() {
        return System.getProperties().getProperty("os.name").toUpperCase().contains("WINDOWS");
    }

    public static String getExtension(String contentType) {
        MimeTypes allTypes = MimeTypes.getDefaultMimeTypes();
        String extension = null;
        try {
            extension = allTypes.forName(contentType).getExtension();
        } catch (MimeTypeException e) {
            e.printStackTrace();
        }
        return extension;
    }

    /**
     * @param file
     * @param request
     * @return
     * 例如如下传了个文件后的操作:
     * bigType: application
     * extension: .pdf
     * uploadPath: \upload\application
     * fileName: 1565157799645_3CDDB9B08A2D1DF34DF6221F4874A956.pdf
     * dirPath: D:\upload\application\2019\08\07
     * filePath: D:\upload\application\2019\08\07\1565157799645_3CDDB9B08A2D1DF34DF6221F4874A956.pdf
     * returnPath: /upload/application/2019/08/07/1565157799645_3CDDB9B08A2D1DF34DF6221F4874A956.pdf
     */
    public static String save(MultipartFile file, HttpServletRequest request) {
        //获取的内容类型 bigType
        String bigType = file.getContentType().split("/")[0];
        //获取文件名的后缀 extension 例如pdf文件则为 .pdf
        String extension = getExtension(file.getContentType());
        SimpleDateFormat df = new SimpleDateFormat(File.separator + "yyyy" + File.separator + "MM" + File.separator + "dd");
        Date now = new Date();
        /**
            file.separator这个代表系统目录中的间隔符,说白了就是斜线,不过有时候需要双线,有时候是单线,你用这个静态变量就解决兼容问题了。
            在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常。
            比如说要在temp目录下建立一个test.txt文件,在Windows下应该这么写:
            File file1 = new File ("C:\tmp\test.txt");
            在linux下则是这样的:
            File file2 = new File ("/tmp/test.txt");
            如果要考虑跨平台,则最好是这么写:
            File myFile = new File("C:" + File.separator + "tmp" + File.separator, "test.txt");
        **/
        //获取的内容类型 上传的地址
        String uploadPath = File.separator + Constants.UPLOAD_DIRECTORY + File.separator + bigType;
        //文件名称
        String fileName = now.getTime() + "_" + request.getSession().getId() + extension;
        //判断当前是部署在windows还是Linux上,在生成上传地址
        String dirPath = (isWindows() ? Constants.DRIVE_LETTER + ":" : Constants.COMPUTER_USER_NAME + "") + uploadPath + df.format(now);
        //生成要存放到的地址的文件地址及其文件名
        String filePath = dirPath + File.separator + fileName;
        //“\”是转义字符,“\\”表示的是一个"\",以此类推,“\\\\”表示两个"\";\\\\\\\\”表示的是四个"\"。
        String returnPath = filePath.substring(filePath.indexOf(uploadPath)).replaceAll("\\\\", "/");

        File dir = new File(dirPath);
        if (!dir.exists()) {
            // 如果该文件不存在,则生成该目录
            dir.mkdirs();
        }
        File newFile = new File(filePath);
        try {
            //服务器上文件上传的地址+文件名 (即上传文件)
            file.transferTo(newFile);
            return returnPath;
        } catch (IOException e) {
            return null;
        }
    }

    public static boolean deleteFile(String fileName) {
        File file = new File(fileName);
        // 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
        if (file.exists() && file.isFile()) {
            if (file.delete()) {
                //System.out.println("删除单个文件" + fileName + "成功!");
                return true;
            } else {
                //System.out.println("删除单个文件" + fileName + "失败!");
                return false;
            }
        } else {
            //System.out.println("删除单个文件失败:" + fileName + "不存在!");
            return false;
        }
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值