spring MVC 下载文件

2019-01-04  本文已影响0人  Daniel1873

一、传统流方式

@RequestMapping(value = "antennaAttitudeDownloadFile.do", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
    @ResponseBody
    public String antennaAttitudeDownloadFile(String path, HttpServletResponse response){
        //判断下载路径是否为空
        if (!StringUtils.isEmpty(path)) {
            //通过绝对路径获取文件
            File file = new File(path);
            //判断文件是否为空
            if (file.exists()) {
                //生成文件名
                String fileName = "测听室.txt";
                // 配置文件下载
                response.setHeader("content-type", "application/octet-stream");
                response.setContentType("application/octet-stream");
                // 下载文件能正常显示中文
                try {
                    response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                // 实现文件下载
                byte[] buffer = new byte[1024];
                FileInputStream fis = null;
                BufferedInputStream bis = null;
                try {
                    fis = new FileInputStream(file);
                    bis = new BufferedInputStream(fis);
                    OutputStream os = response.getOutputStream();
                    int i = bis.read(buffer);
                    while (i != -1) {
                        os.write(buffer, 0, i);
                        i = bis.read(buffer);
                        os.flush();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    if (fis != null) {
                        try {
                            fis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (bis!= null){
                        try {
                            bis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

            }
        } 
        return null;
    }

二、通过 ResponseEntity<byte[]> 进行下载

@RequestMapping(value = "antennaAttitudeDownloadFile.do", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
    @ResponseBody
    public ResponseEntity<byte[]> antennaAttitudeDownloadFile(String path, HttpServletResponse response) {
        //判断下载路径是否为空
        if (!StringUtils.isEmpty(path)) {
            //通过绝对路径获取文件
            File file = new File(path);
            //判断文件是否为空
            if (file.exists()) {
                //生成文件名
                String fileName = "略略略.txt";
                HttpHeaders headers = null;
                try {
                    //请求头
                    headers = new HttpHeaders();
                    //解决文件名乱码
                    String downloadFileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
                    //让浏览器知道用attachment(下载方式)打开图片
                    headers.setContentDispositionFormData("attachment", downloadFileName);
                    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
                try {
                    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

写在最后特别注意的是,文件下载发送请求不能以ajax发送异步请求,以ajax发送的请求返回文件会以二进制流回显到response里,如需要以ajax发送需另行配置

写一种发送请求的方法

<script>
    $("#btn").click(function(){
        var url = "http://localhost:8081/tiankui-tools-web/antennaAttitude/antennaAttitudeDownloadFile.do";
        var form = $("<form></form>").attr("action", url).attr("method", "post");
        form.append($("<input></input>").attr("type", "hidden").attr("name", "path").attr("value",$("#path").val()));
        form.appendTo('body').submit().remove();
});
</script>
上一篇下一篇

猜你喜欢

热点阅读