Springboot + Vue 上传Word、PDF文档并保留内部格式

news2025/1/31 8:02:50

因为业务需求,上传Word文件需要编辑,但如何使用Blob方式,在数据库里存文件,就会造成格式消失。所以修改思路:上传文件到服务器本地,保证数据存储的完整性。

前端

              <el-upload class="upload-demo" :action="item.fileUploadUrl" :show-file-list="false" :limit="1" :multiple="false" :auto-upload="true" :accept="item.accept" :before-upload="beforeUpload"
                :headers="item.uploadHeaders" :data="item.uploadData">上传
              </el-upload></el-button>
              
     fileActionList: [
        {
          width: 60,
          name: "合同文件",
          fileUploadUrl: "*************/importContract",
          uploadData: {},
          uploadHeaders: {},
          accept: ".doc,.docx,.pdf",
        },
      ],



    beforeUpload(file, fileList) {
      let promise = new Promise((resolve) => {
        this.$nextTick(function () {
          resolve(true);
        });
      });
      this.$message.success("上传成功");

      return promise;
    },
        // 文件上传操作
    handleImport(row) {
      this.fileActionList[0].uploadData = {
        id: row.id,
      };
      this.fileActionList[0].uploadHeaders = {
        Authorization: Cookie.get("*******"),
      };
    },

就是常规的传文件

后端

    @ApiOperation("导入合同文件")
    @PostMapping("importContract")
    public Result importData(@RequestParam(value="file") MultipartFile file, @RequestParam(value="id") Long id) throws Exception {
        return projectService.importData(file, id);
    }
        @Override
    public Result importData(MultipartFile file, Long id) throws Exception {
        //获取文件名
        InputStream path = null;
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            path = file.getInputStream();
            fis = (FileInputStream) path;
            File dir = new File("file/project");
            if (!dir.exists()) {
                dir.mkdirs();
            }
            String filePath = "file/project/" + id + "_" + System.currentTimeMillis() + "_" + file.getOriginalFilename();
            fos = new FileOutputStream(filePath);
            int readlen = 0;
            //字节数组,一次读取8个字节
            byte[] buf = new byte[8];
            while ((readlen = fis.read(buf)) != -1) {
                fos.write(buf, 0, readlen);
            }
            Project project = projectRepo.getById(id);
            project.setContactFile(filePath);
            projectRepo.save(project);
        } catch (IOException e) {
            log.error("" + e);
        } finally {
            path.close();
            fis.close();
            fos.close();
        }
        return Result.success("上传成功");
    }

这此采用的思路就是 把文件读取后,写入相对路径,考虑到文件业务误传,服务器源文件不删除,通过时间戳保证唯一性。存到服务器本地。

可以看到,最后格式都保留了下来

![在这里插入图片描述](https://img-blog.csdnimg.cn/6c7c61ef8085404ea23c4be0ca6c6f19.png在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/766116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

centos7.8从卸载python2,安装python3

因为目前所有环境都是python2.7.5&#xff0c;但是项目上使用的是python3.7.5&#xff0c;迫切需要使用python3.7.5验证。安装遇到困难&#xff0c;记录一下。 首先卸载python2&#xff0c;如果不想卸载python2的可以跳过 这里卸载python2和其依赖的yum 先卸载python2.7.5 …

基于意外流行的自适应模因算法求解分布式柔性作业车间调度问题——付源代码和论文

实在是太忙了&#xff0c;终于闲下来更新一下CSDN来介绍自己的工作 《Surprisingly Popular-Based Adaptive Memetic Algorithm for Energy-Efficient Distributed Flexible Job Shop Scheduling》发表在IEEE Transactions on Cybernetics上。 原文链接-可下载 Matlab代码 IEEE…

pdf能转成ppt格式吗?这几个方法你试过了吗

作为办公人士&#xff0c;掌握不同文件格式之间的转换技能是必不可少的。每当毕业季来临&#xff0c;我都会收到许多刚刚步入职场的小伙伴们的求助&#xff0c;寻找PDF转PPT的方法。所以&#xff0c;我总结了以下三种方法&#xff0c;希望能帮助大家解决这个一直以来困扰着许多…

RabbitMQ死信交换机、TTL及延迟队列

一&#xff0c;死信交换机 1&#xff0c;什么是死信交换机 了解死信交换机之前我们先来了解一下什么是死信&#xff0c;当一个队列满足下面的三种情况的时候我们一般称为死信&#xff08;dead letter&#xff09;&#xff1a; 消费者使用basic.reject或 basic.nack声明消费失…

深入 Linux 进程

问题 进程参数 和 环境变量 对于进程意味着什么&#xff1f; 进程参数和环境变量的意义 一般情况下&#xff0c;子进程的创建是为了解决某个子问题 子进程解决问题需要父进程的 "数据输入" (进程参数 & 环境变量) 设计原则&#xff1a; 子进程启动时必然用到…

SpringCloud学习路线(1)—— 从头开始的微服务

一、服务架构的历史 现有的服务框架&#xff1a; 单体架构 概念&#xff1a; 将业务所有功能集中在一个项目中开发&#xff0c;打包部署优点&#xff1a; 架构简单&#xff0c;部署成本低缺陷&#xff1a; 耦合度高 分布式架构 概念&#xff1a; 根据业务功能对系统进行拆分&a…

前端两种实现轮播图方式

今天研究两种简单实现轮播图功能的方式。 目录 Layui实现轮播图 码云下载 提取静态文件 示例 注意 参数说明 改为轮播图 增加图片资源文件 轮播栏目修改 改为上下切换 切换事件 脚本中绑定改变事件 控制器查看 Swiper实现轮播图 下载swiper 下载到本地 加载sw…

【数据结构】_3.List接口实现类ArrayList与线性表

目录 1.List接口 1.1 List接口的集合关系网络 1.2 List的使用 2. ArrayList与顺序表 2.1 线性表 2.2 顺序表 2.3 ArrayList 2.3.1 ArrayList的集合关系网络 2.3.2 ArrayList的使用 2.3.2.1 ArrayList的构造方法 2.3.2.2 ArrayList的扩容机制逻辑示图如下&#xff1…

企业如何通过CRM提高客户转化?

现如今&#xff0c;企业想要给潜在客户留下深刻的印象&#xff0c;那么就需要一系列的措施和手段。通过CRM管理系统让潜在客户信任企业&#xff0c;更好地进行客户培育&#xff0c;从而提高潜在客户转化。下面来说说&#xff0c;企业提高潜在客户转化的7个做法。 1、永远不要让…

input模糊搜索

input模糊搜索 getList() {let dicthis.queryParameters()let val this.queryParams["userName"]if (null ! val && ! val) {dic["userName"]*val*;}listPamsArchiveSearch(dic).then(response > {this.nameinfo response.data;});},主要问…

Spring Batch之读数据库——JdbcCursorItemReader之使用框架提供的BeanPropertyRowMapper(三十六)

一、BeanPropertyRowMapper介绍 参考我的另一篇博客&#xff1a; Spring Batch之读数据库——JdbcCursorItemReader&#xff08;三十五&#xff09;_人……杰的博客-CSDN博客 二、项目实例 1.项目框架 2.代码实现 BatchMain.java: package com.xj.demo27;import org.spri…

Echarts环形饼状图设置内外边框

上班快一个月了&#xff0c;最近再写echarts的项目&#xff0c;亚历山大啊 记录一下饼状图设置内外边框的代码 series: [{name: 项目分数,type: pie,radius: [50%, 70%],avoidLabelOverlap: false,labelLine: {show: true},data: [{value: 335, name: 970分以上},{value: 310…

python用playwright自动化测试程序打包exe

playwright自动化测试代码写好后&#xff0c;打包为exe运行在目标PC上可能出现错误。 原因&#xff1a; 1、运行的PC没有响应的浏览器。 2、playwright没有打包到代码中。 所以本例用AutoPytoExe为例来制作exe程序解决问题。 1、安装&#xff1a; 2、安装完成之后&#xff0c;…

CUDA并行归约算法(二)

CUDA并行归约算法&#xff08;二&#xff09; 文章目录 CUDA并行归约算法&#xff08;二&#xff09;前情回顾线程束分化内存组织Reference>>>>> 欢迎关注公众号【三戒纪元】 <<<<< 前情回顾 首先看下上节设计的核函数&#xff0c;如何进行并行…

基于FPGA的视频接口之HDMI1.4(以下)编码

简介 为什么要特别说明HDMI的版本,是因为HDMI的版本众多,代表的HDMI速度同样不同,当前版本在HDMI2.1速度达到48Gbps,可以传输4K及以上图像,但我们当前还停留在1080P@60部分,且使用的芯片和硬件结构有很大差别,故将HDMI分为两个部分说明1080@60以下分辨率和4K以上分辨率(…

docker运行redis容器

参考文章 Redis从入门到精通&#xff08;4&#xff09;&#xff1a;docker运行redis容器详解 问题及总结 docker 命令 拉取镜像&#xff1a;docker pull redis 或者 docker pull redis:bullseye&#xff1b;查看镜像&#xff1a;docker image ls&#xff1b;直接运行 redis…

Flask SQLAlchemy_Serializer ORM模型序列化

在前后端分离项目中&#xff0c;经常需要把ORM模型转化为字典&#xff0c;再将字典转化为JSON格式的字符串。在遇到sqlalchemy_serializer之前&#xff0c;我都是通过类似Java中的反射原理&#xff0c;获取当前ORM模型的所有字段&#xff0c;然后写一个to_dict方法来将字段以及…

Golang假共享(false sharing)详解

多核处理器(SMP)系统中, 每一个处理器都有一个本地高速缓存。内存系统必须保证高速缓存的一致性。当不同处理器上的线程修改驻留再同一高速缓存中的变量时就会发生假共享(false sharing),结果导致高速缓存无效,并强制更新,进而影响系统性能。 什么是假共享(false sharin…

论文解读|VoxelNet:基于点云的3D物体检测的端到端学习

原创 | 文 BFT机器人 01 摘要 论文提出了表述了一个新的基于点云的3D检测方法&#xff0c;名为VoxelNet&#xff0c;该方法是一个端到端可训练的深度学习架构&#xff0c;利用了稀疏点云的结构特性&#xff0c;直接在稀疏的3D点上进行操作&#xff0c;并通过高效的并行处理体素…

Stable Diffusion - ChatGPT4 与 Stable Diffusion 结合提供无限创意构图

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131782672 ChatGPT 和 StableDiffusion 结合使用的优势&#xff1a; 高效率&#xff1a;ChatGPT 可以在很短的时间内完成复杂的语言任务&#xf…