前后端分离架构文件上传与下载(含Vue + Spring完整代码)

这篇具有很好参考价值的文章主要介绍了前后端分离架构文件上传与下载(含Vue + Spring完整代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

本文采用前后端分离式的架构,其中涉及到文件下载的需求,文件下载在任何系统中都是比较常见的。对于前后端分离架构的文件下载与往常的写法有些许不同(试过直接使用a标签,href填上下载地址,发现行不通),所以经过查找与尝试,以下文件下载前后端实现流程供大家参考。

二、准备

前端:vue + ViewUI

后端:springboot

三、文件下载

1、准备一个文件下载接口,返回文件流

@GetMapping("/download")
public void downloadFile(HttpServletResponse response) {
    // 读取resource目下文件
    String templatePath = "classpath:file/test.txt";
    String filename = " test.txt ";

    File file = null;
    try {
        file = ResourceUtils.getFile(templatePath);
    } catch (FileNotFoundException e) {
        log.warn("文件不存在 {}", filename);
        // todo, 可以在流中返回“文件不存在“,这样用户可以下载到文件,但是内容为”文件不存在”
        return;
    }

    if (file.isFile()) {
        byte[] fileNameBytes = filename.getBytes(StandardCharsets.UTF_8);
        filename = new String(fileNameBytes, 0, fileNameBytes.length, StandardCharsets.ISO_8859_1);
    
        response.reset();
        response.setContentType("application/force-download");
        response.setCharacterEncoding("utf-8");
        response.setContentLength((int) file.length());
        response.setHeader("Content-Disposition", "attachment;filename=" + filename);
    
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {
            byte[] buff = new byte[1024];
            OutputStream os = response.getOutputStream();
            int i;
            while ((i = bis.read(buff)) != -1) {
                os.write(buff, 0, i);
                os.flush();
            }
        } catch (IOException e) {
            log.error("下载出错 {},错误原因 {}", filename, e.getMessage());
        }
    } else {
        log.warn("文件不存在 {}", filename);
        // todo, 可以在流中返回“文件不存在“,这样用户可以下载到文件,但是内容为”文件不存在”
    }
}

2、前端定义一个button标签,通过点击按钮实现文件下载

<Button type="text" @click.stop.prevent="downloadFile">下载</Button>

3、下载按钮点击事件

downloadFile (){
    let downloadUrl = "/download"

    axios({
        url: downloadUrl,
        method: 'get',
        responseType: 'arraybuffer'
    }).then(res => {
        const blob = new Blob([res.data]);
        //创建一个<a></a>标签
        let a = document.createElement("a");
        // 将流文件写入a标签的href属性值
        a.href = URL.createObjectURL(blob);
        //设置文件名
        a.download = "template.py";
        // 隐藏a标签
        a.style.display = "none";
        // 将a标签追加到文档对象中
        document.body.appendChild(a); 
        // 模拟点击了a标签,会触发a标签的href的读取,浏览器就会自动下载了
        a.click();
        //用完就删除a标签
        a.remove();
    })
}

通过以上的做法,就能够在前后端分离架构中实现文件下载啦!

四、文件上传

1、后端准备一个上传文件接口

@PostMapping("/upload")
public Boolean uploadFile(FileVO fileVO) throws Exception {
    String location = "D:\\file";
    String user = "001";
    // 创建存放文件目录,一个用户一个目录
    File dir = Paths.get(location, user).toFile();
    if (!dir.isDirectory()) {
        boolean mkdirs = dir.mkdirs();
        if (!mkdirs) {
            log.error("脚本文件保存目錄創建失敗,目录:{}", dir);
            return false;
        }

        // 保存脚本文件
        MultipartFile file = fileVO.getFile();
        try {
            file.transferTo(Paths.get(location, user,       file.getOriginalFilename()));
        } catch (Exception e) {
            log.error("脚本文件: {} 保存失敗,錯誤原因: {}", file.getOriginalFilename(), e.getMessage());
            return false;
        }
        return true;
    }
}
public class ScriptVO {

    /**
     *文件
     */
    private MultipartFile file;

}

2、定义一个上传标签,通过点击按钮实现文件上传(如果不是使用ViewUI,那么请使用对应前端框架提供的标签)

<div>
    <Upload
        :before-upload="handleUpload"
        type="drag">
        <div style="padding: 20px 0">
        <Icon type="ios-cloud-upload" size="52" style="color: #3399ff"></Icon>
            <p>点击或拖拽选择Python脚本文件</p>
        </div>
    </Upload>
</div>
<div>
    <Button
        type="primary"
        style="margin-left: 8px;"
        @click="submit"
    >确认</Button>
</div>

3、上传按钮点击事件

handleUpload (file) {
    this.uploadFile = file;
    return false;
},
submit(){
    const formData = new FormData();
    formData.append("file", uploadFile);
    axios.post('/upload',formData,{
        'Content-type' : 'multipart/form-data'
    }).then(res=>{
        res = res.data
        // 上传成功后的处理
        if (res == true) {
        // 上传成功
        }
        else {
        // 上传失败
        }
    })
}

通过以上的做法,就能够在前后端分离架构中实现文件上传啦!文章来源地址https://www.toymoban.com/news/detail-605778.html

到了这里,关于前后端分离架构文件上传与下载(含Vue + Spring完整代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • SpringBoot+Vue实现校园二手系统。前后端分离技术【完整功能介绍+实现详情+源码】

    SpringBoot+Vue实现校园二手系统。前后端分离技术【完整功能介绍+实现详情+源码】

    全部源代码地址 :传送门 文章内容有点长,建议打开右侧目录导航栏查看 。         这个系统基本上可以改造为其它类似的系统。后台管理基本上一致。前台进行一些页面样式的改造就可以变成一个新的系统。有时间,做几个变体系统。        闲的无聊,把大学时候

    2024年02月07日
    浏览(3)
  • ruoyi-vue前后端分离框架上传图片不显示问题,nginx解决方案

    使用若依前后端分离框架,前端项目打包在Nginx,上传图片时,图片上传成功,但是在列表页和添加/修改页面没有正常显示。 插入成功后数据库保存数据样式: 回显数据时样式: 此时样式是打不开的,无法找到路径 解决办法:nginx.conf在location中添加alias location /prod-api/profil

    2024年02月02日
    浏览(5)
  • Spring Cloud + Vue前后端分离-第12章 通用权限设计

    Spring Cloud + Vue前后端分离-第12章 通用权限设计

     源代码在GitHub - 629y/course: Spring Cloud + Vue前后端分离-在线课程 这一章我们不依赖第三方框架,我会从权限相关表的设计,到权限的配置,到权限的拦截,带大家一步一步的做出一个通用的权限设计方案。 权限拦截的对象:用户 权限拦截的点:菜单、路由、接口、按钮 控制

    2024年01月16日
    浏览(6)
  • Spring Boot+Vue前后端分离项目如何部署到服务器

    Spring Boot+Vue前后端分离项目如何部署到服务器

    🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 🤖 洛可可白 :个人主页 🔥 个人专栏 :✅前端技术 ✅后端技术 🏠 个人

    2024年04月11日
    浏览(32)
  • 手把手教你搭建Spring Boot+Vue前后端分离

    手把手教你搭建Spring Boot+Vue前后端分离

    1 什么是前后端分离 前后端分离是目前互联网开发中比较广泛使用的开发模式,主要是将前端和后端的项目业务进行分离,可以做到更好的解耦合,前后端之间的交互通过xml或json的方式,前端主要做用户界面的渲染,后端主要负责业务逻辑和数据的处理。 2 Spring Boot后端搭建

    2023年04月08日
    浏览(33)
  • SpringBoot + Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接

    SpringBoot + Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接

    系列文章: SpringBoot + Vue前后端分离项目实战 || 一:Vue前端设计 SpringBoot + Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接 SpringBoot + Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接 SpringBoot + Vue前后端分离项目实战 || 四:用户管理功能实现 SpringBoot + Vue前后

    2024年02月12日
    浏览(12)
  • Java之Spring Boot+Vue+Element UI前后端分离项目

    Java之Spring Boot+Vue+Element UI前后端分离项目

    typeId : this.typeId, }).then((res) = { this.$router.push(“/”); this.$message.success(“文章发布成功!”); }).catch(() = { this.$message.error(“文章发布失败!”); }); }, handleAvatarSuccess(res, file) { this.imageUrl = URL.createObjectURL(file.raw); this.thumbnail = “http://localhost:9090/img/” + res; }, selectType(typename,id) { t

    2024年04月27日
    浏览(8)
  • [每周一更]-(第57期):用Docker、Docker-compose部署一个完整的前后端go+vue分离项目

    [每周一更]-(第57期):用Docker、Docker-compose部署一个完整的前后端go+vue分离项目

    将公司物理机项目改为容器化部署,最终方案是通过容器docker-compose部署使项目可以ip+端口访问,再通过物理机nginx代理进行https域名访问。 可能还有更好的方式,开一个nginx的容器,进行代理,但由于跟物理机80,443端口冲突,暂时没有采用。 可能目前处理不是最好的方式,不

    2024年02月14日
    浏览(9)
  • Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【三】

    Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【三】

    😀前言 本篇博文是关于Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【三】的分享,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地

    2024年02月11日
    浏览(34)
  • Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【六】

    Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【六】

    😀前言 本篇博文是关于Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【六】,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包