• SpringMVC文件下载


    基于此篇文章中的一些没有注释的相关问题,今天进行SpringMVC的文件下载的更新:

    新方法:

    1.控制层,新建一个方法,返回值类型为ResponseEntity<byte[]>的方法,并在其函数的后面添加对应的后台需要处理的参数,比如可以传递FIleName

     /**
         * 文件下载
         *
         * @param id
         * @return
         */
        @GetMapping("/download/")
        public ResponseEntity<byte[]> download(@PathVariable("id") String id) throws IOException {
            File file = xxxService.buildXlsFileById(id);
            return ResponseUtils.buildResponseEntity(file);
        }
    

    2. 编写service返回File文件对象,从Service层中查询数据库操作,并查询文件真正的路径位置,然后返回File对象

    public File buildXlsById(String id){
           //do something to find this file
           File file=new File("1.txt");
           return file;
    }  
    

     3. 编写ResponseUtils中的相关方法

    /**
         * 构建下载类
         * @param file
         * @return
         * @throws IOException
         */
        public static ResponseEntity<byte[]> buildResponseEntity(File file) throws IOException {
            byte[] body = null;
            //获取文件
            InputStream is = new FileInputStream(file);
            body = new byte[is.available()];
            is.read(body);
            HttpHeaders headers = new HttpHeaders();
            //设置文件类型
            headers.add("Content-Disposition", "attchement;filename=" + file.getName());
            //设置Http状态码
         HttpStatus statusCode = HttpStatus.OK;
            //返回数据
         ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(body, headers, statusCode);
            return entity;
        }
    

      

      4.编写相对应得URL即可

    老方法

    /**
         * 文件下载
         * @Description: 
         * @param fileName
         * @param request
         * @param response
         * @return
         */
        @RequestMapping("/download")
        public String downloadFile(@RequestParam("fileName") String fileName,
                HttpServletRequest request, HttpServletResponse response) {
            if (fileName != null) {
                String realPath = request.getServletContext().getRealPath(
                        "WEB-INF/File/");
                File file = new File(realPath, fileName);
                if (file.exists()) {
                    response.setContentType("application/force-download");// 设置强制下载不打开
                    response.addHeader("Content-Disposition",
                            "attachment;fileName=" + fileName);// 设置文件名
                    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);
                        }
                    } catch (Exception e) {
                        // TODO: handle exception
                        e.printStackTrace();
                    } finally {
                        if (bis != null) {
                            try {
                                bis.close();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                        if (fis != null) {
                            try {
                                fis.close();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
            return null;
        }
    

      

  • 相关阅读:
    Android开源项目发现---TextView,Button篇(持续更新)
    Android 性能分析案例
    Android如何正确的保存文件
    注意android裁图的Intent action
    UI设计师的 Android 备忘录
    添加Fragment注意事项
    在 ActionBar 添加刷新按钮
    显示 SQLite 日志
    MySQL数据库的自动备份与数据库被破坏后的恢复(2)
    MySQL数据库的自动备份与数据库被破坏后的恢复1
  • 原文地址:https://www.cnblogs.com/lonecloud/p/5990060.html
Copyright © 2020-2023  润新知