02vue+axios+form实现文件下载(附Java实现代码)

参考文章

form实现文件下载

1.0前端实现思路

用一个from接收后台返回的文件流。form用display为none隐藏;其中form构造action属性,属性值为后台文件下载的参数。同样可以用display为none的input插入form中,input可以携带参数,后台可以用@requestParam接收。
前端具体代码如下:

<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div id="app" class="m-5">
        <input type="button" value="下载" @click="handlerClick">
    </div>
    <script>
        new Vue({
                    el: '#app',
                    data: {
                        files: []
                    },
                    methods: {
                        handlerClick: function () {
                            //自定义form标签,初始化相关参数 
                            var form = document.createElement("form");
                            var access_token = "1756467474";
                            form.setAttribute("style",
                                "display:none");
                            form.setAttribute("method", "get");
                            var params = {};
                            params.Authorization = access_token;
                            form.setAttribute("header",
                                params);
                            var path =
                                'E:\\_ex_workplace\\zxsbWeb\\esgov-zxsb-zxsbweb\\src\\pages\\selfDetection.vue';
                            var input = document.createElement('input');
                            input.setAttribute('type', 'hidden');
                            input.setAttribute('name', 'path');
                            input.setAttribute('value', path);
                            form.append(input);
                            form.setAttribute("action",
                                "http://127.0.0.1:8778/download"
                            );
                            form.setAttribute("target", "_blank");
                            var body = document.createElement("body");
                            body.setAttribute("style", "display:none");
                            document.body.appendChild(form);
                            form.submit();
                            form.remove();
                        }
                    }
    </script>
</body>

</html>

02.java代码实现

后端Java代码实现首先将文件读入到数组buffer中,然后用response获取输出流,输出流将buffer写出即可。

@GetMapping("/download")
    public void download(@RequestParam("path") String path, HttpServletResponse response) {
        System.out.println(path);
        try {
            // path是指欲下载的文件的路径。
            File file = new File(path);
            // 取得文件名。
            String filename = file.getName();
            // 取得文件的后缀名。
            String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();

            // 以流的形式下载文件。
            InputStream fis;
            fis = new BufferedInputStream(new FileInputStream(path));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();
            // 设置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
            response.addHeader("Content-Length", "" + file.length());
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 12,537评论 1 91
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 24,826评论 1 45
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 161,636评论 24 692
  • 1、很早就听过《围城》,这次因为笑来老师《财富自由之路》提到了这本书,我立即买回来并开始阅读。跟着笑来老师的脚步,...
    阿白不急阅读 146评论 0 0
  • 今天谈谈怎么查字典的问题。 不管学哪门外语,查字典都是必不可少的,阅读读不懂,听力听不懂很大程度上是词汇跟不上,遇...
    youjia阅读 1,870评论 1 4
  • 前言: Autorelease机制对于iOS开发人员对对象的内存管理省下不少心血,说白了就是你甭管内存的管理问题,...
    繁华三千_泰然独处阅读 4,443评论 1 17