美文网首页
springboot上传文件和下载文件

springboot上传文件和下载文件

作者: markeNick | 来源:发表于2020-11-13 18:08 被阅读0次

    上传文件

    步骤:

    • 使用MultipartFile接收前端传送过来的文件

    • 生成存放到服务器的目录

    • 在服务器创建一个同名本地文件

    • 将上传的文件内容输入到本地文件

    • 将服务器文件路径返回给前端

    依赖

    <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();
        }
    }
    

    下载文件

    步骤

    • 前端传入文件的路径url

    • 根据url创建一个File类对象

    • 设置头部信息和编码

    • 通过HttpServletResponse获取输出流

    • 将File内容写入到输出流

    • 关闭输出流

    代码

    @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有无注释版本代码

    相关文章

      网友评论

          本文标题:springboot上传文件和下载文件

          本文链接:https://www.haomeiwen.com/subject/blrbbktx.html