您现在的位置是:首页 > 正文

浏览器软件下载,点击超链接、图标等直接下载(前后端代码)

2024-01-30 21:19:05阅读 0

这只是后台的写法,前端需要做一定的操作才可以下载


import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

/**
 * =======================
 * Introduce:
 * User: Jiangjr
 * Date: 2022/6/22
 * 下载工具类
 * =======================
 */
@RestController
@RequestMapping("/api/down")
public class DownUtil {
    /**
     * @param response
     * @功能描述 下载文件:         浏览器下载,点击超链接、图标等直接下载
     */
    @GetMapping("/download")
    public  void downloadFile(HttpServletRequest request, HttpServletResponse response, @RequestParam("fileName") String fileName,@RequestParam("filePath") String filePath)
            throws IOException {
        File directory = new File("");// 参数为空

        String courseFile = directory.getCanonicalPath();  //获取文件所在的规范路径  规范路径就是不包含相对路径如 ..\ 或者 .\ 的绝对路径
        //截取到实际的文件名称在服务器中的路径
        String newName = filePath.substring(8);
        //定位到项目的路径
        String outFileName = fileName;
        // 先去掉文件名称中的空格,然后转换编码格式为utf-8,保证不出现乱码,
        // 这个文件名称用于浏览器的下载框中自动显示的文件名
        //被下载的文件在服务器中的路径,
        String downloadFilePath = courseFile + "\\" + "upload" + "\\" + newName;
        System.out.println(downloadFilePath);
        File file = new File(downloadFilePath);
        if (file.exists()) {
            response.setHeader("Content-Length", "" + file.length());
            response.setContentType("application/octet-stream");
            // response.setHeader("Content-Disposition", "attachment;filename=" + outFileName);
            if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") < 0) {
                if (request.getHeader("User-Agent").toUpperCase().indexOf("EDGE") > 0) {
                    response.setHeader("Content-Disposition", "attachment;  filename=" + URLEncoder.encode(outFileName, "UTF-8"));
                    //response.setHeader("Content-Length","12454555514421");
                } else {
                    response.setHeader("Content-Disposition", "attachment; filename=" + new String(outFileName.getBytes("GBK"), "ISO8859-1"));
                    //response.setHeader("Content-Length",file.length()+"");
                }
            } else {
                response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(outFileName, "UTF-8"));//IE浏览器
                //response.setHeader("Content-Length","12454555514421");
            }
            //ProgressBarThread pbt = new ProgressBarThread((int)file.length());//创建进度条
            //new Thread(pbt).start();//开启线程,刷新进度条
            byte[] buff = new byte[1024];
            BufferedInputStream bis = null;
            OutputStream os = null;
            try {
                os = response.getOutputStream();
                bis = new BufferedInputStream(new FileInputStream(file));
                int i = bis.read(buff);
                while (i != -1) {
                    os.write(buff, 0, i);
                    i = bis.read(buff);
                    // pbt.updateProgress(size);//写完一次,更新进度条
                }
                // pbt.finish();//文件读取完成,关闭进度条
                os.flush();

            } catch (FileNotFoundException e1) {
                //e1.getMessage()+"系统找不到指定的文件";
                // return "系统找不到指定的文件";
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (bis != null) {
                    try {
                        bis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            //  return "success";
        }
        // return "文件未找到";
    }

}


前端也贼拉简单,直接超链接就行,这就相当于你发了一个请求然后去访问接口

window.location.href="https://localhost:8090/api/down/downloadfileUpload?filePath=upload//NaviAcceptor.app.zip&fileName=NaviAcceptor.app.zip"

网站文章

  • SpringMVC之ModelFactory

    ModelFactory是用来维护Model的,具体包含两个功能1、初始化Model2、处理器执行后将Model中相应的参数更新到SessionAttributes中public void initModel(NativeWebRequest request, ModelAndViewContainer mavContainer, HandlerMethod handlerMethod) ...

    2024-01-30 21:18:58
  • 主线程等待线程池里所有线程执行完成之后再执行

    CountDownLatch实现主线程等待线程池中所有线程执行完之后再执行

    2024-01-30 21:18:48
  • redis笔记(一)——redis持久化基础

    1 RDB持久化RDB持久化时redis默认使用的持久化功能。该功能可以创建一个经过压缩的二进制文件,其中包含了服务器在数据库中存储的键值对数据等信息RDB持久化产生的文件以.rdb后缀结尾,rdb代表redis database1.1 redis创建RDB文件的方式用户既可以使用SAVE命令或者BGSAVE命令手动创建RDB文件,也可以通过设置save配置选项让服务器在...

    2024-01-30 21:18:19
  • 腾讯“微视”,还没活就被“美拍”拍死了?

    腾讯“微视”,还没活就被“美拍”拍死了?http://mp.weixin.qq.com/s?__biz=MzA4ODc5MTgzNw==&mid=200325762&idx=2&sn=0e1d60d7d781e22949cec3632460cdb8&3rd=MzA3MDU4NTYzMw==&scene=6#rd腾讯家的短视频App“微视”最近压...

    2024-01-30 21:18:12
  • 详述load-on-startup

    一、xml中作用 简介:nub可以设置该servlet在加载时的优先级以及是否在容器中加载该servlet 其中的nub为数字:当为正整数是,表示加载,且数字越小代表优先级越高;若为负数,则容器启动时不加载,只有该servlet被选中才加载

    2024-01-30 21:18:06
  • (八)相关关系与回归关系的区别与联系?

    (八)相关关系与回归关系的区别与联系?

    《深入浅出统计学》-读书笔记 第8篇本文内容: 第15章 相关与回归:我的线条如何?

    2024-01-30 21:17:58
  • Qt之XML:解析和生成XML文件

    我们可以使用writeStartDocument()函数写入XML文档的开始标记,并使用writeStartElement()和writeAttribute()函数编写元素的开始标记和属性。最后,我们...

    2024-01-30 21:17:25
  • 五子棋:起源、原理与游戏规则、vue实现五子棋案例游戏

    五子棋:起源、原理与游戏规则、vue实现五子棋案例游戏

    五子棋作为一种深受欢迎的棋类游戏,其简单的规则和丰富的历史背景使其成为了中华文化的一部分。通过了解五子棋的历史、原理和游戏规则,我们可以更好地理解这一游戏的魅力所在,并在游戏中体验到中国传统文化的独特韵味。

    2024-01-30 21:17:18
  • 【STM32】FreeRTOS编码风格

    00. 目录 文章目录00. 目录01. FreeRTOS编码标准02. FreeRTOS变量命名规则03. FreeRTOS函数命名规则04. FreeRTOS宏命名规则05. FreeRTOS数据...

    2024-01-30 21:16:49
  • 2022-06-09 工作记录--yarn/npm-Error-EPERM: operation not permitted, uv_cwd

    2022-06-09 工作记录--yarn/npm-Error-EPERM: operation not permitted, uv_cwd

    yarn/npm-Error-EPERM: operation not permitted, uv_cwd

    2024-01-30 21:16:41