springboot上传文件和下载文件

2020-11-13  本文已影响0人  markeNick

上传文件

步骤:

依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.7</version>
        </dependency>
    </dependencies>

代码

/** 
 *  这里只简易写出关键流程,不考虑统一返回值、全局异常处理、日志记录
 **/
@RequestMapping("/upload")
private String upload(@RequestParam("file") MultipartFile file) {

    if (file == null && file.isEmpty()) {
        return "文件不能为空";
    }

    // 获取原始文件名,如:aaa.txt
    String fileName = file.getOriginalFilename();

    // 生成存放到服务器上的目录
    String path = MyFileUtil.generateFileName(fileName);

    // 使用hutool工具包创建文件
    FileUtil.mkParentDirs(path);

    // 获取刚刚创建的文件对象,用来进行写入数据
    File localFile = new File(path);

    // 将上传的文件内容写入到在服务器创建的文件
    try {
        file.transferTo(localFile);
    } catch (Exception e) {
        System.out.println("上传异常");
        e.printStackTrace();
    }

    // 把文件路径返回给前端
    return path;
}

文件名和目录生成工具类

/**
 *  文件工具类,用来生成文件名和存放目录
 **/
public class MyFileUtil {

    /**
     * Linux 文件存放目录
     */
    public static final String DATA_FILE_PATH = "/data/file/";

    /**
     * Windows 文件存放目录
     * 方便测试用
     */
//    public static final String DATA_FILE_PATH = "C:\\";

    /**
     * 生成上传到目录下的文件名
     * @param oryFileName 如:aaa.txt
     * @return  如:/data/file/2020/11/6/asfsasds/dsadastd_aaa.txt
     */
    public static String generateFileName(String oryFileName) {
        oryFileName = oryFileName == null ? "" : oryFileName;

        String path = new StringBuilder(createRepairFileDir())
                .append(RandomStringUtils.randomAlphanumeric(8))
                .append("_")
                .append(oryFileName.length() > 100 ? oryFileName.substring(oryFileName.length() / 2) : oryFileName)
                .toString();

        return path;
    }

    /**
     * 目录格式:/data/file/year/month/day/随机数/
     * 如: /data/file/2020/11/11/asfsasds/
     */
    public static String createRepairFileDir() {
        Calendar calendar = Calendar.getInstance();
        int month = calendar.get(Calendar.MONTH) + 1;

        return new StringBuilder().append(DATA_FILE_PATH)
                .append(File.separator)
                .append(calendar.get(Calendar.YEAR))
                .append(File.separator)
                .append(month > 9 ? "" : "0")
                .append(month).append(File.separator)
                .append(calendar.get(Calendar.DAY_OF_MONTH))
                .append(File.separator)
                .append(RandomStringUtils.randomAlphanumeric(8))
                .append(File.separator)
                .toString();
    }
}

下载文件

步骤

代码

@RequestMapping("/download")
public void download(@RequestParam("url") String url, HttpServletResponse response) 
    throws IOException {

    // 创建文件对象
    File file = new File(url);

    // 获取url中的文件 名称.后缀
    String fileName = url.substring(url.lastIndexOf(File.separator));

    // 根据文件后缀获取对应头部的 content-type类型
    MediaType mediaType = MediaTypeFactory.getMediaType(fileName).get();

    // 编码格式,防止乱码
    response.setCharacterEncoding("UTF-8");

    // 设置头部 content-type 类型,不同文件不同类型
    response.setHeader("content-type", mediaType.toString());

    // 设置文件在浏览器中打开还是下载,由前端去控制
    response.setHeader("Content-Disposition", 
                       "attachment;fileName=" + URLEncoder.encode(url, "UTF-8"));

    // 从response 获取输出流
    ServletOutputStream os = response.getOutputStream();

    // 利用hutool工具包将文件内容写入到输出流
    FileUtil.writeToStream(file, os);

    // 关闭输出流
    os.close();
}

Demo 已上传至 Github
demo有无注释版本代码

上一篇下一篇

猜你喜欢

热点阅读