文件的上传下载功能算是一个比较常用的功能,前段时间在着急忙慌的做项目的时候,这部分是由师弟来完成,现在使用Springboot自己总结一下。所有的功能均已测试成功。代码会在评论区给出github地址

非公众号都在评论区给出地址,因为一篇文章会发到我的各个平台,懒得再描述了,公z号的代码地址直接在文末给出。

直接来看步骤。

一、环境搭建

名称版本
Idea2018专业版(已破解)
Maven4.0.0
SpringBoot2.2.2
jdk1.8

idea之前发过一次破解码,结果因为违规,文章被删了,这是我群里的一个朋友分享的,亲测可用,2018和2019版本的可以永久破解,需要的可以私信我。

二、整合开发

步骤一:创建Springboot项目,名为SpringbootFile,添加相应的依赖

这一个步骤很简单,不给出具体的实现了。准备工作就是添加依赖

 1    <dependencies>
2        <dependency>
3            <groupId>org.springframework.boot</groupId>
4            <artifactId>spring-boot-starter-web</artifactId>
5        </dependency>
6
7        <dependency>
8            <groupId>org.springframework.boot</groupId>
9            <artifactId>spring-boot-starter-test</artifactId>
10            <scope>test</scope>
11        </dependency>
12        <dependency>
13            <groupId>org.springframework.boot</groupId>
14            <artifactId>spring-boot-starter-freemarker</artifactId>
15        </dependency>
16
17    </dependencies>

步骤二:单文件上传的功能

浏览器有一个文件上传到服务器。因此服务器需要接受处理。这一个步骤的实现很简单,首先我们创建一个包controller,然后再这个包里面创建FileController类

 1@RestController
2public class FileController {
3    private static final Logger log = LoggerFactory.getLogger(FileController.class);
4    @RequestMapping(value = "/upload")
5    public String upload(@RequestParam("file") MultipartFile file) {
6        try {
7            if (file.isEmpty()) {
8                return "file is empty";
9            }
10            String fileName = file.getOriginalFilename();
11            String suffixName = fileName.substring(fileName.lastIndexOf("."));
12            log.info("上传的文件名为:" + fileName+" 后缀名为" + suffixName);
13            // 设置文件存储路径(G盘),你可以存放在你想要指定的路径里面。
14            String filePath = "G:\\";
15            String path = filePath + fileName;
16            File dest = new File(path);
17            // 检测是否存在目录
18            if (!dest.getParentFile().exists()) {
19                dest.getParentFile().mkdirs();// 新建文件夹
20            }
21            file.transferTo(dest);// 文件写入
22            return "upload success";
23        } catch (IllegalStateException e) {
24            e.printStackTrace();
25        } catch (IOException e) {
26            e.printStackTrace();
27        }
28        return "upload failure";
29    }
30 }

步骤很明确,首先判断一下传过来的文件是否为空,然后取出文件名和后缀名,最后指定自己的文件路径和刚刚取出的文件名和后缀名进行保存即可。

步骤三:多文件上传的功能

为了实现这个功能,只需要在刚刚那个类新增加一个处理多文件的方法即可。

 1@RestController
2public class FileController {
3    @PostMapping("/batch")
4    public String handleFileUpload(HttpServletRequest request) {
5        List<MultipartFile> files = 
6            ((MultipartHttpServletRequest) request).getFiles("file");
7        MultipartFile file = null;
8        BufferedOutputStream stream = null;
9        for (int i = 0; i < files.size(); ++i) {
10            file = files.get(i);
11            String filePath = "G:\\uploads";
12            if (!file.isEmpty()) {
13                try {
14                    byte[] bytes = file.getBytes();
15                    stream = new BufferedOutputStream(new FileOutputStream(
16                            new File(filePath + file.getOriginalFilename())));
17                    stream.write(bytes);// 写入
18                    stream.close();
19                } catch (Exception e) {
20                    stream = null;
21                    return "the " + i + " file upload failure";
22                }
23            } else {
24                return "the " + i + " file is empty";
25            }
26        }
27        return "upload Multifile success";
28    }
29}

这个步骤很简单,首先通过file参数,拿到多个文件。然后for循环处理,其内部通过输入输出流进行保存到本地。

步骤四:下载文件

我们还在刚刚那个类新增加一个处理下载文件的方法即可。

 1@RestController
2public class FileController {
3    @GetMapping("/download")
4    public String downloadFile(HttpServletRequest request, 
5                               HttpServletResponse response)
 
{
6        String fileName = "";// 文件名
7        if (fileName != null) {
8            //设置文件路径
9            File file = new File("G:\\MyProject\\aas.txt");
10            if (file.exists()) {
11                response.setContentType("application/force-download");
12                response.addHeader("Content-Disposition""attachment;fileName=" 
13                                   + fileName);
14                byte[] buffer = new byte[1024];
15                FileInputStream fis = null;
16                BufferedInputStream bis = null;
17                try {
18                    fis = new FileInputStream(file);
19                    bis = new BufferedInputStream(fis);
20                    OutputStream os = response.getOutputStream();
21                    int i = bis.read(buffer);
22                    while (i != -1) {
23                        os.write(buffer, 0, i);
24                        i = bis.read(buffer);
25                    }
26                    return "download success";
27                } catch (Exception e) {
28                    e.printStackTrace();
29                } finally {             
30                    bis.close();                
31                    fis.close();  
32                }
33            }
34        }
35        return "failure";
36    }
37}

这段代码其实也比较容易理解,用户点击了下载链接之后,首先服务器设置一下参数,然后使用输出输出流将制定路径下的文件进行输出。

步骤四:测试

我本来想用reactjs建一个文件,出现了跨域问题,懒得写了,就用了postman测试了一下均成功。不过为了代码的完整性,还是给出一个前端的代码。

 1<!DOCTYPE html>
2<html lang="en">
3<head>
4    <meta charset="UTF-8">  <title>${msg}</title>
5</head>
6<body>
7    <p>单文件上传</p>
8    <form action="upload" method="post" enctype="multipart/form-data">
9        文件:<input type="file" name="file"/>
10        <input type="submit"/>
11    </form>
12    <hr/>
13    <p>文件下载</p>
14    <form action="batch" method="post" enctype="multipart/form-data">
15           <p>文件1:<input type="file" name="file"/></p>
16        <p>文件2:<input type="file" name="file"/></p>
17        <p><input type="submit" value="上传"/></p>
18    </form>
19</body>
20</html>

上面使用的是模板技术FreeMarker,只需要放在src/main/resources/templates,文件名index.ftl。不过你在使用使用之前需要添加依赖。在一开始已经给出。

github地址:https://github.com/fengdongdongwsn/MyjavaStudy.git


更多相关文章

  1. MyBatis之Mapper XML 文件详解(六)-缓存配置
  2. MyBatis之Mapper XML 文件详解(四)-JDBC 类型和嵌套查询
  3. MyBatis之Mapper XML 文件详解(五)-自动映射查询结果
  4. 【不用框架】文件上传和下载
  5. 文件权限管理剖析
  6. Spring Boot 揭秘与实战 关于配置文件有哪些很棒的特性
  7. 全文检索引擎 Solr 系列(3)— Solr 核心概念、配置文件
  8. 使用Rails 3.2和AJAX(非flash上传解决方案)将多个文件直接上载到
  9. 使用ajax请求上传文件[副本]

随机推荐

  1. Android(安卓)使用MediaPlayer播放音乐
  2. 【Android热修复与插件化 三】ClassLoade
  3. Android系统关机或重启的几种实现方式
  4. 实现Android包的批量删除
  5. 整理:RelativeLayout的相关属性
  6. Android关于cpu/cpuset/schedtune的应用
  7. Android: android sensors, HAL范例
  8. Android设置TextView字间距与行间距
  9. Android LinearLayout布局随心所欲
  10. HTML颜色代码表