SpringMVC下载文件(link形式,form 形式和ajax形式)

2 篇文章 0 订阅
本文介绍了使用SpringMVC进行文件下载的三种方式:1)link直接下载;2)通过调用后端接口点击链接下载;3)利用ajax方式POST请求下载。详细讲解了html和接口代码,并提供了防止文件名乱码的处理方法。
摘要由CSDN通过智能技术生成

SpringMVC下载文件(link形式,form 形式和ajax形式)

三种形式:

  1. link直接下载文件 (文件必须已经存在)
  2. 点击链接调用后端接口下载文件
  3. ajax方式下载文件

1. link直接下载

<h1>link直接下载</h1>
<a href="/upload/测试.csv" value="下载">文件下载</a>

2.点击链接调用后端接口下载

  • 工具类DownloadUtil

    • 用来设置下载文件的response的格式和文件名
    • 转换文件名,防止下载的时候文件名是乱码
 package com.min.spring.util;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 
 public class DownloadUtil {
 
     //设置下载文件的response的格式和文件名
     public static HttpServletResponse setResponseForDownload(HttpServletResponse response, String filename) {
         //配置response内容
         response.reset();
         response.setCharacterEncoding("UTF-8");
         //设置为二进制
         response.setContentType("application/octet-stream");
         response.setHeader("Content-Disposition", "attachment; filename=" + filename);
         return response;
     }
 
     //转换文件名,防止下载的时候文件名是乱码
     public static String filenameEncode(HttpServletRequest request, String filename) throws UnsupportedEncodingException {
         String userAgent = request.getHeader("User-Agent");
         if (/* IE 8 至 IE 10 */
                 userAgent.toUpperCase().contains("MSIE") ||
                         /* IE 11 */
                         userAgent.contains("Trident/7.0")) {
             filename = URLEncoder.encode(filename, "UTF-8");
         } else if (userAgent.toUpperCase().contains("MOZILLA") ||
                 userAgent.toUpperCase().contains("CHROME")) {
             filename = new String(filename.getBytes(), "ISO-8859-1");
         } else {
             filename = URLEncoder.encode(filename, "UTF-8");
         }
         return filename;
     }
 }
 
html
<h1>链接下载</h1>
<a href="/test/getDownload?filename=测试文件.txt">a标签下载</a>    

<!--form提交-->
<h1>form提交</h1>
<form action="/test/getDownload" method="get">
    <input type="submit" value="input_submit" />需要在form中提交<br/>
    <button type="submit" value="button_submit" >button_submit提交</button>需要在form中提交
</form>
接口代码(Get方式)
@RequestMapping(value = "test/getDownload", method = RequestMethod.GET)
    @ResponseBody
    public void getDownload(
            @RequestParam(required = false) String searchString,
            HttpServletRequest request,
            HttpServletResponse response) throws IOException {
        //下载文件名的设置 方式1:自定义文件名
        String filename = "测试get.txt";

        //下载文件名的设置 方式2:采用传递过来的参数作为文件名
        // String filename = request.getParameter("filename");

        //转换文件名,防止下载的时候文件名是乱码
        filename = DownloadUtil.filenameEncode(request, filename);
        //设置下载文件的response的格式和文件名
        response = DownloadUtil.setResponseForDownload(response, filename);

        ServletOutputStream outputStream = response.getOutputStream();
        outputStream.write("这是测试文件get".getBytes());
        outputStream.flush();
        outputStream.close();

    }

3.ajax方式下载文件(POST方式)

该ajax代码分为2步

  • 第一步, 利用preDownload检查下载前的检查操作,如果失败可以停止下载操作
  • 第二步,第一步没有失败的情况下,动态创建一个form来提交请求
HTML
<h1>AJAX下载文件</h1>
ajax下载时会动态创建一个form提交请求<br/><br/>
下载时传送的参数<input type="text" id="searchString" value="">
<button id="ajax_download" value="ajax下载" onclick="download()">下载</button>

<script src='/static/assets/js/jquery-2.0.3.min.js'></script>
<script>
    function download() {
        var searchString = $("#searchString").val();
        $.ajax({
            url: "/test/preDownload",
            method: "post",
            data: {
                searchString: searchString
            },
            success: function (response, status, request) {
                var disp = request.getResponseHeader('Content-Disposition');
                if (response != "OK") {
                    alert("检查失败");
                    return;
                }
                var form = $('<form method="POST" action="/test/postDownload">');
                var mySearchString = $('<input type="hidden" name="searchString"/>');
                mySearchString.attr("value", searchString)
                form.append(mySearchString);

                $('body').append(form);
                form.submit().remove();
            }
        })

    }
</script>
接口代码(POST方式)

** 不生成服务器文件,直接写数据流

** searchString为传递的参数. 在业务中可以参数可以是作为筛选数据的条件.

    //用来做下载前的检查等操作
	@RequestMapping(value = "test/preDownload", method = RequestMethod.POST)
    @ResponseBody
    public String preDownload(
            @RequestParam(required = false) String searchString,
            HttpServletRequest request,
            HttpServletResponse response) {
        return "OK";
    }

	//下载接口
    @RequestMapping(value = "test/postDownload", method = RequestMethod.POST)
    @ResponseBody
    public void postDownload(
            @RequestParam(required = false) String searchString,
            HttpServletRequest request,
            HttpServletResponse response) throws IOException {

        //下载文件名的设置 方式1:自定义文件名
        String filename = "测试post.xml";

        //下载文件名的设置 方式2:采用传递过来的参数作为文件名
        // String filename = request.getParameter("filename");

        //转换文件名,防止下载的时候文件名是乱码
        filename = DownloadUtil.filenameEncode(request, filename);
        //设置下载文件的response的格式和文件名
        response = DownloadUtil.setResponseForDownload(response, filename);

        ServletOutputStream outputStream = response.getOutputStream();
        outputStream.write("这是测试文件post\n".getBytes());
        outputStream.write(("这个是传送过来的参数:"+searchString).getBytes());
        outputStream.flush();
        outputStream.close();

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值