从服务器下载文件并且浏览器可以选择下载地址

本文介绍了如何在SpringBoot应用中结合Thymeleaf实现从服务器下载资源文件的功能。当资源存在时,允许用户选择保存路径;若资源不存在,则在浏览器中显示提示窗口。

从服务器下载资源文件

说明:从服务器下载文件,如果有资源可下,没有资源下载则返回弹窗给页面

本项目使用的是springboot 集成 thymeleaf

pom文件:
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
thymeleaf 配置
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.servlet.content-type=text/html
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML
spring.thymeleaf.cache=false

后端代码

public void downloadContract(String filePathName, HttpServletRequest request, HttpServletResponse response)  {
        //重置
        response.reset();
        //设置格式为了返回html页面格式
        response.setContentType("text/html; charset=UTF-8");
        String localAddr = request.getLocalAddr();
        File file = null;
        PrintWriter writer = null;
        try {
            writer = response.getWriter();
            file = new File("bestSignUpload"+File.separator+filePathName);
            if (!file.exists()) {
                //以js格式返回
                writer.print("<script>alert('下载的文件不存在,请下载后再来');window.location.href='http://"+localAddr+":"+port+"/index';</script>");
                return;
            }

            if (!file.isFile()) {
                writer.print("<script>alert('下载的文件不存在,请下载后再来');window.location.href='http://"+localAddr+":"+port+"/index';</script>");
                return ;
            }
			//本项目使用map来判断文件是否已经压缩完成,如果存在可以则认为没有压缩完成
            if (contractMap.containsKey(filePathName)) {
                writer.print("<script>alert('文件尚未压缩完成,请稍后在来下载');window.location.href='http://"+localAddr+":"+port+"/index';</script>");
                return;
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            //此处在重置一遍是因为response不可以同时获取OutputStream与PrintWriter,因此防止同接口不同返回值报错
            response.reset();
            assert file != null;
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
            //为了返回文件流
            response.setContentType("application/octet-stream");
            OutputStream outputStream = response.getOutputStream();
            BufferedOutputStream bos = new BufferedOutputStream(outputStream);
            response.setCharacterEncoding(Constant.ConstantString.UTF_8);
            response.setHeader("Content-Disposition", "inline; filename=\"" + filePathName + "\"");
            IOUtils.copy(bis,bos);
            bos.flush();
            bos.close();
            bis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

前端简单页面

<div style="margin-top: 20px">
            <form th:action="@{/oa/synData/project/downloadContract}" target="_parent" id="download_form" method="post">
                <div><p style="font-size: 16px;font-weight: bolder;color: red">下载合同到本地</p></div>
                <div class="download_div inputStyle buttonStyle">
                    <label for="download" class="labelClass control-label">下载地址:</label>
                    <input type="text" id="download" name="filePathName" autocomplete="off" placeholder="请输入需要下载的压缩包名称(例如:xxx.zip)" />
                </div>
                <div><input type="button" class="btn btn-primary" id="download_input" value="下载"></div>
            </form>
        </div>

项目截图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值