springboot上传下载 (内部路径 上传到磁盘路径)

本文介绍了如何在SpringBoot应用中设置文件上传和下载的路径,包括在配置文件中定义上传路径,通过静态属性获取路径,文件上传时的校验、命名规则,以及下载操作的实现。提供了完整的上传下载代码示例。
摘要由CSDN通过智能技术生成

一.获取上传路径

1.首先 在配置类(application.yml)里配置了上传的路径
目前放在了 D:/filePath/springBoot-shiro/uploadPath下
在这里插入图片描述

profile:
  filePath: D:/filePath/springBoot-shiro/uploadPath

2.上传路径获取

/**
 * Description:获取文件的父级路径
 *
 * @Author: yangyanbin
 * @Date: Created in 2019/12/13 16:16
 */
@Component
public class FilePathUtil {
   
  public static String FILE_PATH;
  @Value("${profile.filePath}")
  public void setPageSize(String filePath) {
   
    FILE_PATH = filePath;
  }
}

这样 获取路径可以直接 类名点静态属性 而不是通过注入

3.调用方法
在这里插入图片描述
在文件上传类中使用 静态属性获取

  /**
     * 文件绝对路径
     */
    public static String FILE_PATH = FilePathUtil.FILE_PATH;

二.上传

 /**
     * 文件上传操作
     *
     * @param file 文件
     * @throws IOException
     */
    private static void upload(MultipartFile file) throws IOException {
   
        OutputStream out = null;
        try {
   
            byte[] bytes = file.getBytes();
            //文件校验
            fileCheck(file);
            //存储到服务器的文件名(新文件名)
            String newFileName = encodingFilename(file.getOriginalFilename());//对名字的操作
            File desc = getAbsoluteFile(String.format("%s/%s", FILE_PATH, newFileName));//创建文件
            out = new FileOutputStream(desc);//输出流
            out.write(bytes);
        } catch (BaseException e) {
   
            logger.warn(String.format("上传异常【系统异常】,消息:%s", e.getMessage()));
            throw e;
        } catch (Exception e) {
   
            logger.warn(String.format("上传异常【应用异常】,消息:%s", e.getMessage()));
            throw e;
        } finally {
   
            if (out != null) {
   
                out.close();
            }
        }
    }

2.文件校验

 /**
     * 文件校验  文件名称长度校验  后缀名校验  文件大小校验
     *
     * @param file
     */
    private static void fileCheck(MultipartFile file) {
   
        //文件名称长度校验
        int fileNamelength = file.getOriginalFilename().length();
        if (fileNamelength > DEFAULT_FILE_NAME_LENGTH) {
   
            throw new BaseException("附件名长度不能超过:" + DEFAULT_FILE_NAME_LENGTH);
        }

        //后缀名校验 !exe
        String suffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
        if (suffixName.equals("exe")) {
   
            throw new BaseException("不能上传exe结尾的可执行文件!");
        }

        //文件大小校验
        long size = file.getSize();
        if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE) {
   
            throw new BaseException(String.format("附件大小不能超过%sMB", DEFAULT_MAX_SIZE / 1024 / 1024));
        }
    }

3.文件标识名称 格式为 “yyyyMMddHHmmssSS”

/**
     *  返回新文件名文件标识名称 格式为 "yyyyMMddHHmmssSS"
     * (服务器上的 重新生成的名字(时间戳))
     * @param fileName (原文件名称) 
     * @return  返回 /年/月/文件名.后缀名 的路径
     */
    private static final String encodingFilename(String fileName) {
   
        String newFileName = DateUtils.parseDateToStr("yyyyMMddHHmmssSS", Calendar.getInstance().getTime());//获取当前时间戳
        String suffixName = fileName.substring(fileName.lastIndexOf(".") + 1);//后缀名称
        Calendar date = Calendar.getInstance();
        String year = String.valueOf(date.get(Calendar.YEAR));//当前年
        int month = date.get(Calendar.MONTH) + 1; //当前月份
        //附件数据表
        return String.format("%s/%s/%s.%s", year, month, newFileName, suffixName);
    }

4.如果没有文件创建文件

 /**
     * 如果没有文件创建文件
     *
     * @param absolutePath 绝对路径
     * @return
     * @throws IOException
     */
    private static final File getAbsoluteFile(String absolutePath) throws IOException {
   
        File desc = new File(File.separator + absolutePath);
        if (!desc.getParentFile().exists()) {
   
            desc.getParentFile().
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值