Spring MVC文件下载

755 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情

前言

上一篇文章我们使用Spring MVC实现了文件上传,底层的原理的使用了I/O流,Spring MVC进行了封装方便了我们进行操作,这篇文章我们来讲讲Spring MVC的文件下载。

文件下载

原理

文件下载与文件上传的过程相反,服务器通过输入流将本地的文件读取,然后通过输出流和网络请求将文件发送到客户端。

代码示例

1.创建下载页面。

很简单,我们使用一个超链接来实现文件下载的请求。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="/file/download/1">1.png</a>
</body>
</html>

2.然后我们写文件下载相关的请求方法。

@GetMapping("/down")
public String down(){
    return "download";
}

@GetMapping("/download/{name}")
public void download(@PathVariable String name, HttpServletRequest request, HttpServletResponse response) throws IOException {
    name += ".jpg";
    String path = request.getServletContext().getRealPath("file");
    File file = new File(path,name);
    OutputStream outputStream = null;
    if(file.exists()){
        response.setContentType("application/forc-download");
        response.setHeader("Content-Disposition","attachment;filename="+name);
        outputStream = response.getOutputStream();
        outputStream.write(FileUtils.readFileToByteArray(file));
        outputStream.flush();

        if (outputStream != null){
            outputStream.close();
        }
    }
}

代码解析

前面下载页面使用的是超链接,超链接是GET请求,我们这里写的就是@GetMapping注解,请求路径是使用了一个REST风格传输数据,我们获取下所要下载的文件名。使用@PathVariable注解将文件名的参数从路径中取出并赋值给函数参数列表中定义的name。

我们下载文件首先要去文件所在位置去读取文件,所以我们需要request参数,读取之后我们要做响应,这就需要response参数。

我们取到的name只是文件名,所以我们先要加上文件的后缀名。然后获取文件的绝对路径。取到绝对路径我们就使用File获取这个文件,取到这个文件后我们使用输出流outputStream将文件进行输出。先做个文件是否存在的判断。

response.setContentType("application/forc-download");
response.setHeader("Content-Disposition","attachment;filename="+name);

这里我们进行一些响应的设置文件名为下载后的文件名,我们这里就设置为原文件名。

然后相应内容和输出流进行对接,后面使用输出流进行操作完成文件的写入操作。

这样我们就简单的完成了Spring MVC的文件下载的代码了。我们来测试下能不能成功下载。

下载功能测试

我们要下载的话,需要先上传一个文件。

先进入上传页面进行上传。

微信截图_20221025005822.png

点击上传,查看file文件夹中是否有上传的文件。

微信截图_20221025010030.png

文件上传成功!

然后我们进入下载页面。

微信截图_20221025010135.png

点击超链接进行下载。

选择文件下载位置,点击保存。

微信截图_20221025010236.png

微信截图_20221025010309.png

我们去看看刚才选择的下载位置中有没有我们下载的图片。

微信截图_20221025010522.png

下载成功!

总结

文件上传下载的方式有很多种,Spring MVC对其进行了封装,我们能更加方便的进行操作。Spring MVC文件下载的内容就先讲到这里了。喜欢的小伙伴们多多支持,你们的支持就是我更新的动力。