Java实现文件下载

Java实现文件下载Java实现文件下载

大家好,又见面了,我是你们的朋友全栈君。

一、前台通过a标签打开接口,传入文件id

<a href="/cdc/announcement/downloadFile/1">下载</a>

二、后台接收id,查找对应文件,进行下载

    @RequestMapping(value = "downloadFile/{id}", method = RequestMethod.GET)
    @PreAuthorize("hasAuthority('view')")
    @ResponseBody
    public void downloadFile(HttpServletRequest req, HttpServletResponse resp, @PathVariable("id") Long id) {
        AnnouncementAnnex announcementAnnex = announcementAnnexService.selectById(id);
        //真实文件名
        String name = announcementAnnex.getAnnexUrl();
        String downloadName=announcementAnnex.getAnnexName();
//        进行转码后的文件名,用来下载之后的文件名
        PublicController.download(resp,name,downloadName);
    }

其中download方法

 /**
     * @param resp
     * @param name         文件真实名字
     * @param downloadName 文件下载时名字
     */
    public static void download(HttpServletResponse resp, String name, String downloadName) {
        String fileName = null;
        try {
            fileName = new String(downloadName.getBytes("GBK"), "ISO-8859-1");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        ///home/tomcat/apache-tomcat-9.0.1/files
        String realPath = "D:" + File.separator + "apache-tomcat-8.5.15" + File.separator + "files";
//        String realPath=File.separator+"home"+File.separator+"tomcat"+File.separator+"apache-tomcat-9.0.1"+File.separator+"files";
        String path = realPath + File.separator + name;
        File file = new File(path);
        resp.reset();
        resp.setContentType("application/octet-stream");
        resp.setCharacterEncoding("utf-8");
        resp.setContentLength((int) file.length());
        resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        byte[] buff = new byte[1024];
        BufferedInputStream bis = null;
        OutputStream os = null;
        try {
            os = resp.getOutputStream();
            bis = new BufferedInputStream(new FileInputStream(file));
            int i = 0;
            while ((i = bis.read(buff)) != -1) {
                os.write(buff, 0, i);
                os.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

fileName是文件下载之后的名字,filePath是文件所在文件夹地址,path是文件地址,注意设置的响应类型和编码方式

其中File.separator为路径分隔符,他能自动识别是哪个操作系统而使用不同的路径分隔符(windows是‘\’,linux是‘/’)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156824.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • setfacl命令基本用法[通俗易懂]

    setfacl命令基本用法[通俗易懂]setfacl命令可以用来细分linux下的文件权限。chmod命令可以把文件权限分为u,g,o三个组,而setfacl可以对每一个文件或目录设置更精确的文件权限。换句话说,setfacl可以更精确的控制权限的分配。比如:让某一个用户对某一个文件具有某种权限。这种独立于传统的u,g,o的rwx权限之外的具体权限设置叫ACL(AccessControlList)ACL可以针

    2022年6月16日
    45
  • Python3网络爬虫快速入门实战解析

    Python3网络爬虫快速入门实战解析请在电脑的陪同下,阅读本文。本文以实战为主,阅读过程如稍有不适,还望多加练习。本文的实战内容有:网络小说下载(静态网站)、优美壁纸下载(动态网站)、爱奇艺VIP视频下载PS:本文为Gitchat线上分享文章,该文章发布时间为2017年09月19日。

    2022年6月12日
    27
  • 云边端与边缘计算技术「建议收藏」

    云边端与边缘计算技术「建议收藏」云边端与边缘计算技术

    2022年6月22日
    31
  • 常用的css文件_css常用的三种选择器

    常用的css文件_css常用的三种选择器reset.css(几乎每个项目都要引入的css)@charset"utf-8";html{background-color:#fff;color:#000;font-size

    2022年8月1日
    1
  • 什么是MVC三层架构?「建议收藏」

    什么是MVC三层架构?「建议收藏」1.1、什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。 是将业务逻辑、数据、显示分离的方法来组织代码。 MVC主要作用是降低了视图与业务逻辑间的双向偶合。 MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。 Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:ValueObj

    2022年6月25日
    23
  • LNMP详解(九)——Nginx虚拟IP实战

    LNMP详解(九)——Nginx虚拟IP实战今天继续给大家介绍Linux运维的相关知识,本文主要内容是Nginx的虚拟IP实战。一、实战背景二、虚拟IP配置三、效果检验

    2022年10月10日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号