文件下载与上传

文件,下载,上传 · 浏览次数 : 30

小编点评

```java @GetMapping("/download") public void download(HttpServletResponse response, @RequestParam String versionNum) { if (StringUtils.isEmpty(versionNum)) { throw new ServiceException("版本号不能为空"); } String canonicalPath = FileUtil.getCanonicalPath(new File("..\")); String filePath = canonicalPath + "/device-upgrade-pack-repo/" + versionNum + "/\" + versionNum + ".tar"; BufferedInputStream stream = FileUtil.getInputStream(filePath); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=\" + versionNum + ".tar\");"); stream.read(response.getOutputStream()); stream.close(); } ``` **代码说明:** * `@GetMapping("/download")` 表示下载请求的路径。 * `@RequestParam String versionNum` 表示下载请求参数的版本号。 * `String canonicalPath` 表示文件系统的上一级目录。 * `String filePath` 表示下载文件的路径。 * `BufferedInputStream` 用于读文件。 * `response.setContentType()` 设置下载文件的类型。 * `response.setHeader()` 设置下载文件的标题。 * `stream.read()` 读取文件内容。 * `stream.close()` 关闭文件流。 * `return` 表示下载请求是否成功。 **排版说明:** * `String canonicalPath` 中的路径包含斜杠。 * `String filePath` 中的路径包含斜杠和文件名称。 * `BufferedInputStream` 用于读文件,确保文件读取完整。

正文

文件上传与下载

工具:hutool

springboot 文件上传与下载,hutool目录操作、文件解压、yaml文件操作。此例子展示了一个文件压缩包上传到服务器,解压放到某个特定目录的,并且校验md5值

html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传界面</title>
</head>
<body>
<div>
    <form method="POST" enctype="multipart/form-data" action="/upload">
        <table>
            <tr>
                <td><input type="file" name="file"/></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="上传"/></td>
            </tr>
        </table>
    </form>
​
    <a href="http://localhost:8080/download" download> file_name </a>
​
</div>
</body>
</html>

springboot

上传

    /**
     * 规定,一个归档文件比如叫 1.1.1.2023.tar 这个归档文件里面有两个文件一个叫:upgrade-info.yml 一个叫:1.1.1.2023.tar.gz
     * 这个归档文件放到 /device-upgrade-pack-repo/1.1.1.2023 文件夹,然后将归档文件在此目录解压,然后删除归档文件
     * 最终目录结构为:
     * /device-upgrade-pack-repo/1.1.1.2023
     * |--> 1.1.1.2023.tar.gz
     * |--> upgrade-info.yml
     * |--> 1.1.1.2023.tar
     *
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public AjaxResult upload(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return error("文件不能为空");
        }
        String filename = file.getOriginalFilename();
        // 文件大概名字为:1.1.1.2023.tar ,不要 .tar 后缀
        String versionNum = filename.substring(0, filename.length() - 4);
        // jar包的上一级目录
        String canonicalPath = FileUtil.getCanonicalPath(new File(".."));
        // 创建目录
        String directory = canonicalPath + "/device-upgrade-pack-repo/" + versionNum;
        FileUtil.mkdir(directory);
        // 将文件放到目录
        String filePath = directory + "/" + filename;
        try {
            // 此方法是,如果文件已经存在,那么会删除老的,然后用新的文件
            file.transferTo(new File(filePath));
        } catch (IOException e) {
            throw new ServiceException("文件上传失败");
        }
        // 解压
        Extractor extractor = CompressUtil.createExtractor(
                CharsetUtil.defaultCharset(),
                FileUtil.file(filePath));
​
        extractor.extract(FileUtil.file(directory));
​
        // 读取upgrade-info.yml 文件, 对比md5,如果不正确则返回错误,并删除目录
        Yaml yaml = new Yaml();
        BufferedInputStream inputStream = FileUtil.getInputStream(directory + "/upgrade-info.yml");
        Map<String, Object> obj = yaml.load(inputStream);
        try {
            inputStream.close();
        } catch (IOException e) {
            throw new ServiceException("读取upgrade-info.yml异常,查看文件是否存在");
        }
        String md5 = (String) obj.get("md5");
        String version = (String) obj.get("versionNum");
        String devType = (String) obj.get("devType");
        // 校验md5值
        String digestHex = SecureUtil.md5().digestHex(FileUtil.file(filePath + ".gz"));
​
        // 如果md5值不相等
        if (!StringUtils.equals(md5, digestHex)) {
            log.info("md5 {} digestHex {}", md5, digestHex);
            // 删除目录,并且返回错误
            boolean del = FileUtil.del(directory);
            if (del) {
                return error("压缩包与yml文件中校验码不一致,请确认升级包是否正确");
            } else {
                return error("压缩包与yml文件中校验码不一致,且上传的文件删除失败,请联系系统管理员");
            }
        }
        // 返回upgrade-info.yml 中的信息
        JSONObject res = new JSONObject();
        res.put("versionNum", version);
        res.put("checkCode", md5);
        res.put("devType", devType);
        return success(res);
    }

下载

根据一定规则找到文件目录,然后进行下载

"Content-disposition: attachment;filename=" + versionNum + ".tar" 这个的作用是设置下载的文件的名字,比如说versionNum的值为1.1.0,那么下载文件的名字为1.1.0.tar

    @SneakyThrows
    @GetMapping("/download")
    public void download(HttpServletResponse response, @RequestParam String versionNum) {
        if (StringUtils.isEmpty(versionNum)) {
            throw new ServiceException("版本号不能为空");
        }
        // jar包的上一级目录
        String canonicalPath = FileUtil.getCanonicalPath(new File(".."));
        String filePath = canonicalPath + "/device-upgrade-pack-repo/" + versionNum + "/" + versionNum + ".tar";
​
        BufferedInputStream stream = FileUtil.getInputStream(filePath);
​
        response.setContentType("application/octet-stream");
        response.setHeader("Content-disposition",
                "attachment;filename=" + versionNum + ".tar");
        // Read the input stream and print to the console till EOF.
        byte[] buf = new byte[16384];
        int bytesRead;
        while ((bytesRead = stream.read(buf, 0, buf.length)) >= 0) {
            response.getOutputStream().write(buf, 0, bytesRead);
        }
        stream.close();
    }

与文件下载与上传相似的内容:

文件下载与上传

# 文件上传与下载 工具:hutool springboot 文件上传与下载,hutool目录操作、文件解压、yaml文件操作。此例子展示了一个文件压缩包上传到服务器,解压放到某个特定目录的,并且校验md5值 ## html ``` 文件上传界面 ​ file_name ​ ``` ## sprin

如何使用JavaScript实现在线Excel附件的上传与下载?

前言 在本地使用Excel时,经常会有需要在Excel中添加一些附件文件的需求,例如在Excel中附带一些Word,CAD图等等。同样的,类比到Web端,现在很多人用的在线Excel是否也可以像本地一样实现附件文件的操作呢?答案是肯定的,不过和本地不同的是,Web端不会直接打开附件,而是使用超链接单

JavaScript能否实现在线Excel附件的上传与下载?

>摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:[葡萄城官网](https://www.grapecity.com.cn/),葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 # 前言 在本地使用Excel时,经常会有需要在Excel中添加一些附件文件的需求,例如在Ex

Windows平台文件拆分与完整性检查的过程

# Windows平台文件拆分与完整性检查的过程 ## 场景 ``` 有时候在没有linux主机的情况下, 自己下载下来的文件比较大. 比较难以上传到一些特殊的系统/主机上面. 这个时候需要将文件进行拆分. 所以可以通过winrar 或者是zip等工具进行打包切分 但是一方面,压缩,解压缩表费时费力

【VS Code 与 Qt6】QAction 类的一些事

QAction 类表示用户命令的一种抽象,包括命令文本、图标、命令触发后要执行的代码。菜单、工具栏按钮往往存在相同的功能,将这些命令独立抽出来,放到 QAction 以象上,可避免编写重复的代码。比如“文件”菜单下有“保存”命令,工具栏上也会有“保存”按钮。因此,创建一个表示“保存”的 QActio

ContextSwitch 学习与使用

ContextSwitch 学习与使用 说明 github上面有一个简单的测试系统调用以及上下文切换的工具. contextswitch. 下载之后直接make就可以进行简单的测试 需要注意的是 部分arm环境没有: -mno-avx 这个参数, 需要去掉一下. 官方文档以及说明 Little mi

1.14 手工插入ShellCode反弹

PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密,病毒分析,外挂技术等,本次的目标是手工修改或增加节区,并给特定可执行程序插入一段`ShellCode`代码,实现程序运行自动反弹一个Shell会话。

Web攻防--xxe实体注入

# web攻防--xxe实体注入 ## 漏洞简介 XML 外部实体注入(也称为 XXE)是一种 Web 安全漏洞,允许攻击者干扰应用程序对 XML 数据的处理。它通常允许攻击者查看应用程序服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。 在某些情况下,攻击者可以利用 X

通过 openpyxl 操作 excel 表格

> 博客地址:https://www.cnblogs.com/zylyehuo/ # STEP1: 导入相关库 ```python import os from openpyxl import load_workbook ``` # STEP2: 构建存放路径,将上传文件下载到服务器该路径下 ```

2.简单的搭建后端,一步一步从基础开始(2023-9-20优化更新第一次)

上传Git的忽略文件下载 千万不能忘记配置忽略文件,不然可能会搞得你一个项目10多个G,很烦人 先梳理下我们需要新建的项目如下。接口层一般I(i)开头,实现层不需要。后面还会增加扩展类或者其他的。 API程序层:FastEasyAPI 服务接口层:FastEasy.IService 服务实现层:Fa