• SpringBoot文件上传下载


    项目中经常会有上传和下载的需求,这篇文章简述一下springboot项目中实现简单的上传和下载。

    新建springboot项目,前台页面使用的thymeleaf模板,其余的没有特别的配置,pom代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    
    	<groupId>com.dalaoyang</groupId>
    	<artifactId>springboot_upload_download</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<packaging>jar</packaging>
    
    	<name>springboot_upload_download</name>
    	<description>springboot_upload_download</description>
    
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>1.5.9.RELEASE</version>
    		<relativePath/> <!-- lookup parent from repository -->
    	</parent>
    
    	<properties>
    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    		<java.version>1.8</java.version>
    	</properties>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-thymeleaf</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-devtools</artifactId>
    			<scope>runtime</scope>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    
    		<dependency>
    			<groupId>net.sourceforge.nekohtml</groupId>
    			<artifactId>nekohtml</artifactId>
    			<version>1.9.15</version>
    		</dependency>
    	</dependencies>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    
    </project>
    

    前台页面index.html,其中包含单个上传,下载,批量上传。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <p>单文件上传</p>
    <form action="upload" method="POST" enctype="multipart/form-data">
        文件:<input type="file" name="file"/>
        <input type="submit"/>
    </form>
    <hr/>
    <p>文件下载</p>
    <a href="download">下载文件</a>
    <hr/>
    <p>多文件上传</p>
    <form method="POST" enctype="multipart/form-data" action="batch">
        <p>文件1:<input type="file" name="file"/></p>
        <p>文件2:<input type="file" name="file"/></p>
        <p><input type="submit" value="上传"/></p>
    </form>
    </body>
    </html>
    

    IndexController只是用来页面的跳转

    package com.dalaoyang.Controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     * @author dalaoyang
     * @Description
     * @project springboot_learn
     * @package com.dalaoyang.Controller
     * @email yangyang@dalaoyang.cn
     * @date 2018/4/9
     */
    @Controller
    public class IndexController {
    
        @RequestMapping("/")
        public String index()
        {
            return "index";
        }
    }
    

    最后是本文的重点,FileController,其中包含单个上传,单个下载,批量上传对应的方法。需要注意下载功能写的是对应我电脑里面固定位置的文件,仅供大家来参考。以下是代码:

    package com.dalaoyang.Controller;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.multipart.MultipartHttpServletRequest;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.*;
    import java.util.List;
    
    
    /**
     * @author dalaoyang
     * @Description
     * @project springboot_learn
     * @package com.dalaoyang.Controller
     * @email yangyang@dalaoyang.cn
     * @date 2018/4/9
     */
    @RestController
    public class FileController {
        private static final Logger log = LoggerFactory.getLogger(FileController.class);
    
        @RequestMapping(value = "/upload")
        public String upload(@RequestParam("file") MultipartFile file) {
            try {
                if (file.isEmpty()) {
                    return "文件为空";
                }
                // 获取文件名
                String fileName = file.getOriginalFilename();
                log.info("上传的文件名为:" + fileName);
                // 获取文件的后缀名
                String suffixName = fileName.substring(fileName.lastIndexOf("."));
                log.info("文件的后缀名为:" + suffixName);
                // 设置文件存储路径
                String filePath = "/Users/dalaoyang/Downloads/";
                String path = filePath + fileName;
                File dest = new File(path);
                // 检测是否存在目录
                if (!dest.getParentFile().exists()) {
                    dest.getParentFile().mkdirs();// 新建文件夹
                }
                file.transferTo(dest);// 文件写入
                return "上传成功";
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "上传失败";
        }
    
        @PostMapping("/batch")
        public String handleFileUpload(HttpServletRequest request) {
            List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
            MultipartFile file = null;
            BufferedOutputStream stream = null;
            for (int i = 0; i < files.size(); ++i) {
                file = files.get(i);
                String filePath = "/Users/dalaoyang/Downloads/";
                if (!file.isEmpty()) {
                    try {
                        byte[] bytes = file.getBytes();
                        stream = new BufferedOutputStream(new FileOutputStream(
                                new File(filePath + file.getOriginalFilename())));//设置文件路径及名字
                        stream.write(bytes);// 写入
                        stream.close();
                    } catch (Exception e) {
                        stream = null;
                        return "第 " + i + " 个文件上传失败 ==> "
                                + e.getMessage();
                    }
                } else {
                    return "第 " + i
                            + " 个文件上传失败因为文件为空";
                }
            }
            return "上传成功";
        }
    
        @GetMapping("/download")
        public String downloadFile(HttpServletRequest request, HttpServletResponse response) {
            String fileName = "dalaoyang.jpeg";// 文件名
            if (fileName != null) {
                //设置文件路径
                File file = new File("/Users/dalaoyang/Documents/dalaoyang.jpeg");
                //File file = new File(realPath , fileName);
                if (file.exists()) {
                    response.setContentType("application/force-download");// 设置强制下载不打开
                    response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名
                    byte[] buffer = new byte[1024];
                    FileInputStream fis = null;
                    BufferedInputStream bis = null;
                    try {
                        fis = new FileInputStream(file);
                        bis = new BufferedInputStream(fis);
                        OutputStream os = response.getOutputStream();
                        int i = bis.read(buffer);
                        while (i != -1) {
                            os.write(buffer, 0, i);
                            i = bis.read(buffer);
                        }
                        return "下载成功";
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        if (bis != null) {
                            try {
                                bis.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        if (fis != null) {
                            try {
                                fis.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
            return "下载失败";
        }
    }
    
  • 相关阅读:
    前后端分离
    git的基本使用
    PHP中的接口
    Java里面的接口
    面向对象的接口
    python调用Shell脚本:os.system(cmd)或os.popen(cmd)()【转】
    得到系统删除程序里的FIREFOX
    NSMutableArray,NSArray (From DFdou's Blog)
    iPhone delegate 两界面传递数据(转)
    字符串乘积运算+连接
  • 原文地址:https://www.cnblogs.com/dalaoyang/p/8776807.html
Copyright © 2020-2023  润新知