文件下载与上传

文件,下载,上传 · 浏览次数 : 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附件的上传与下载?

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

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

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

通过mat获取OOM时对象信息的方法与过程

通过mat获取OOM时对象信息的方法与过程 背景 如果谁的耐心不好, 就让他去看MAT里的objects信息. 有项目出现了OOM的情况 我在公司这边有一台内存比较高的Win10机器. 然后帮助同事进行了dump文件的分析. 为了备忘, 这里简单总结一下. 时间总结 公司网络限速. 总结为: 下载2

[转帖]PostgreSQL数据加载工具之pg_bulkload

https://www.jianshu.com/p/b576207f2f3c 1. pg_bulkload介绍 PostgreSQL提供了一个copy命令的便利数据加载工具,copy命令源于PostgreSQL数据库,copy命令支持文件与表之间的数据加载和表对文件的数据卸载。pg_bulkload

从内核世界透视 mmap 内存映射的本质(源码实现篇)

本文基于内核 5.4 版本源码讨论 通过上篇文章 《从内核世界透视 mmap 内存映射的本质(原理篇)》的介绍,我们现在已经非常清楚了 mmap 背后的映射原理以及它的使用方法,其核心就是在进程虚拟内存空间中分配一段虚拟内存出来,然后将这段虚拟内存与磁盘文件映射起来,整个 mmap 系统调用就结束了

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

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

[转帖]源码安装postgresql13+uuid-ossp+pg_pathman

https://www.jianshu.com/p/5331ad46861a 系统版本:Centos7.8 数据库版本:postgresql-13.6 pg_pathman版本:1.5.12 所有文件下载地址:链接:https://pan.baidu.com/s/1XvMk_q4WCtb0rImTq

通过 openpyxl 操作 excel 表格

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

springboot下载文件 范围下载

# springboot下载文件 范围下载 关键词:springboot,download,Range,Content-Range,Content-Length,http code 206 Partial Content 下载文件的一部分,我们在request header:Range 中指定要获取