java 文件表创建及前后端使用

news2024/11/29 10:51:48

====表结构task_file====

========前端具体到业务表单==========

 <el-form-item label="任务附件" prop="taskAttachment">
          <el-upload ref="upload" accept=".jpg, .png, .txt, .xlsx, .doc, .docx, .xls, .pdf, .zip, .rar"
            :action="upload.url" multiple :http-request="HttpUploadFile" :headers="upload.headers"
            :file-list="upload.fileList" :on-remove="handleRemove" :on-success="handleFileSuccess"
            :on-change="changeFileList" :data="getfileData()" :auto-upload="false">
            <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
          </el-upload>

        </el-form-item>

参数说明===============

data

upload: {

        // 是否禁用上传

        isUploading: false,

        // 设置上传的请求头部

        headers: { Authorization: "Bearer " + getToken() },

        // 上传的地址

        url: process.env.VUE_APP_BASE_API + "/system/taskFile/upload/task",

        // 上传的文件列表

        fileList: []

      },

=============

:action="upload.url"   上传后端接口

==================

multiple 可多选

==================

:http-request="HttpUploadFile"  增加数据

 HttpUploadFile(file) {

      this.fileData.append('files', file.file); // append增加数据

    },

===============

headers="upload.headers" 请求头

=============

 :file-list="upload.fileList" 文件列表

=======================

:on-remove="handleRemove" 移除文件操作

 handleRemove(file, fileList) {

      this.upload.fileList = fileList

      this.deleteFilePath.push(file.url)

    },

=================

:on-success="handleFileSuccess" 上传成功的操作

  //文件上传成功后的钩子函数

    handleFileSuccess(response, file, fileList) {

      this.upload.isUploading = false;

      this.upload.fileList = []

      this.$modal.msgSuccess(response.msg);

    },

==================

 :on-change="changeFileList" 列表长度改变的操作

  //fileList长度改变时触发

    changeFileList(file, fileList) {

      this.upload.fileList = fileList

      console.log(this.upload.fileList)

    },

======================

:data="getfileData()" 加载数据

  getfileData() {

      //此处的form是表单中的其它绑定值

      return this.form.taskAttachment

    },

=======================

:auto-upload="false" 是否自动上传

========================

==修改提交上传文件==

  this.submitUpload()

 submitUpload() {

      //创建FormData对象,用于携带数据传递到后端

      this.fileData = new FormData()

      this.$refs.upload.submit();

      this.fileData.append("data", JSON.stringify(this.form));

      this.fileData.append("headers", { Authorization: "Bearer " + getToken() });

      this.fileData.append("withCredentials", false)

      this.fileData.append("filename", "file");

      var i = this.upload.fileList.length

      console.log(i)

      if (i !== 0) {

        //此处执行调用发送请求

        uploadFile(this.fileData).then((res) => {

          if (res.code === 200) {

            this.upload.isUploading = false;

            this.upload.fileList = []

            // this.$modal.msgSuccess(res.msg);

            this.open = false;

            this.getList();

          }

        })

      } else {

        this.open = false;

        this.getList();

        //如果没有文件要上传在此处写逻辑

      }

    },

====下载====

 <el-table-column label="任务附件" align="center">

        <template slot-scope="scope">

          <el-link type="primary" style="margin-right:10px" v-for=" item  in  scope.row.taskFileVos " :key="item.fileId"

            @click.prevent="downloadFile(item)">{{ item.oFileName }}</el-link>

        </template>

      </el-table-column>

=============

 downloadFile(item) {

      this.download('system/taskFile/download/resource', {

        filePath: item.filePath,

      }, item.oFileName)

    },

===前端展现===

 <el-table-column label="任务附件" align="center">
        <template slot-scope="scope">
          <el-link type="primary" style="margin-right:10px" v-for=" item  in  scope.row.taskFileVos " :key="item.fileId"
            @click.prevent="downloadFile(item)">{{ item.oFileName }}</el-link>
        </template>

      </el-table-column>

====后端====

构造回显表单构造集成实体类供查询使用

/*文件及文件附件*/
public class TaskVo  extends SysProjectTask {
    private List<TaskFile> taskFileVos;

    public TaskVo(List<TaskFile> taskFileVos) {
        this.taskFileVos = taskFileVos;
    }

    public TaskVo() {
    }

    public List<TaskFile> getTaskFileVos() {

        return taskFileVos;
    }

    public void setTaskFileVos(List<TaskFile> taskFileVos) {

        this.taskFileVos = taskFileVos;
    }




    @Override
    public String toString() {
        return "TaskVo{" +
                "taskFileVos=" + taskFileVos +
                '}';
    }
}

==============

@RestController
@RequestMapping("/taskFile")
public class TaskFileController {

    @Autowired
    private ITaskFileService taskFileService;




    /*任务附件上传*/
    @PostMapping("/upload/task")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult uploadFile(@RequestParam("files") MultipartFile[] files, @RequestParam("data") String data) {
        try {
            //这里的data是同时携带的其它信息就是前端的form里的信息,可以是用下面的json方式解析为自己相应的对象
            System.out.println(data);
            SysProjectTask sysProjectTask = JSONObject.toJavaObject(JSONObject.parseObject(data), SysProjectTask.class);
            // 上传文件路径 E:/ruoyi/uploadPath
            String filePath = RuoYiConfig.getUploadPath();
            System.out.println("========================"+filePath);
            String fileName = "";
            String url = "";
            // 上传并返回新文件名称
            AjaxResult ajax = AjaxResult.success();
            for (int i = 0; i < files.length; i++) {
                /*/profile/upload/2024/03/19/4004308e-fd63-4323-89cc-6a7c8641f148.txt*/
//                fileName = FileUploadUtils.upload(filePath, files[i]);
                fileName = FileUploadUtils.upload(filePath, files[i]);
                url = filePath+fileName;
                TaskFile taskFile = new TaskFile();
                /*任务文件名,保存的名称*/
                taskFile.setTaskName(fileName);
                /*文件保存路径*/
                taskFile.setFilePath(url);
                /*文件原名*/
                taskFile.setoFileName(files[i].getOriginalFilename());
                /*关联任务ID*/
                taskFile.setTaskId(sysProjectTask.getTaskId());
                /*文件大小*/
                taskFile.setFileSize(String.valueOf(files[i].getSize()));
                /*w文件类型*/
                taskFile.setFileType(files[i].getContentType());
                taskFile.setUploadTime(DateUtils.getNowDate());
                taskFile.setProjectId(sysProjectTask.getProjectId());
                taskFileService.insertTaskFile(taskFile);
            }
            return ajax;
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return AjaxResult.error(e.getMessage());
        }
    }

    /*通过任务ID去查询任务附件名称*/
    @GetMapping("/read/{taskId}")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult readTaskFile(@PathVariable("taskId") Long taskId) {
        TaskFile taskFile = new TaskFile();
        taskFile.setTaskId(taskId);
        List<TaskFile> taskFiles = taskFileService.selectTaskFileList(taskFile);
        System.out.println(taskFiles);
        List<TaskFileVo> taskFileVos = new ArrayList<>();
        taskFiles.forEach(taskFile1 -> taskFileVos.add(new TaskFileVo(taskFile1)));
        System.out.println(taskFileVos);
        return AjaxResult.success(taskFileVos);
    }



    /**/
    @PostMapping("/upload/updateTaskFile")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult deleteFile(@RequestBody List<String> filePath) {
        try {
            for (String deleteFilePath : filePath) {
                taskFileService.deleteFilePath(deleteFilePath);
                FileUtils.deleteFile(deleteFilePath);
            }
            return AjaxResult.success("修改成功");
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return AjaxResult.error(e.getMessage());
        }
    }


    /**
     * 本地资源通用下载
     */
    @RequiresPermissions("system:task:export")
    @Log(title = "导出附件", businessType = BusinessType.EXPORT)
    @PostMapping("/download/resource")
    public void resourceDownload(String filePath, HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println(filePath);

        response.setCharacterEncoding("utf-8");
        response.setContentType("multipart/form-data");

        FileUtils.writeBytes(filePath, response.getOutputStream());
    }






}

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

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

相关文章

(三)小程序样式和组件

视频链接&#xff1a;尚硅谷2024最新版微信小程序 文章目录 小程序的样式和组件介绍样式-尺寸单位 rpx样式-全局样式和局部样式组件-组件案例演示组件案例-轮播图区域绘制组件案例-轮播图图片添加组件案例-绘制公司信息区域组件案例-商品导航区域组件案例-跳转到商品列表组件案…

Java实现 selenium Web自动化测试(简单篇)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

LifeCycle之ProcessLifeCycleOwner

问题&#xff1a;想要知道应用程序当前处在前台、后台、或从后台回到前台&#xff0c;想要知道应用的状态&#xff0c; LifeCycle提供了ProcessLifeCycleOwner的类&#xff0c;方便我们知道整个应用程序的生命周期情况 ProcessLifeCycleOwner 使用方法 1.首先添加依赖 imple…

Flutter 首次亮相 Google Cloud Next 大会

作者 / Kelvin Boateng Flutter 团队在近期首次参加了 Google Cloud Next 大会&#xff0c;这意味着 Flutter 在开发社区中的影响力正在日益增长。 Google Cloud Next https://cloud.withgoogle.com/next 我们与 Google Cloud、Firebase、Very Good Ventures 和 Serverpod 的团…

深化产教融合,泰迪智能科技助力西南林业大学提质培优

2024年5月7日&#xff0c;泰迪智能科技昆明分公司院校部总监查良红和数据部负责人余雄亮赴西南林业大学理学院就工作室共建事宜进行交流会谈。西南林业大学理学院院长张雁、党委副书记魏轶、副院长谢爽、就业负责人罗丽及学生代表参与本次交流会。 会议伊始&#xff0c;谢副院长…

C++语法|进程虚拟地址空间和函数调用栈

本文来自施磊老师的课程&#xff0c;老师讲的非常不错&#xff0c;我的笔记也是囫囵吞枣全部记下&#xff0c;但是我在这里推荐一本书&#xff0c;真的真的建议初学C或者想要进阶C的同学们看看&#xff1a;《CPU眼里的C/C》 文章目录 进程的虚拟地址空间和布局进程虚拟地址空间…

服务异步通讯MQ

同步调用存在的问题: 异步调用方案: RabbitMQ安装: 第一种:在线拉取 docker pull rabbitmq:3-management 第二种:将已有的安装包放入再用load加载 我这里放到tmp包里边 然后:cd /tmp docker load -i mq.tar 加载进去 然后运行mq容器 docker run \-e RABBITMQ_DEFAULT_USER…

tag-字符串:数组拆分I

题目 给定长度为 2n 的整数数组 nums &#xff0c;你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) &#xff0c;使得从 1 到 n 的 min(ai, bi) 总和最大。 返回该 最大总和 。 示例 题解一 class Solution:def arrayPairSum(self, nums: List[int]) …

@Test测试Mapper接口报错java.lang.NullPointerException

Test测试Mapper接口报错java.lang.NullPointerException 报错原因&#xff1a;没有注入依赖 解决方法&#xff1a;在测试类上面添加SpringBootTest

windows 环境下安装《车辆动态监控系统》支持JT808、JT1078、苏标主动安全设备接入

《车辆动态监控系统》下载安装部署包 开放端口 80/443/8800&#xff0c;web后台端口&#xff0c;nginx代理服务&#xff0c;nginx默认为8800端口8808&#xff0c;JT808专用端口6802&#xff0c;视频播放推流端口6891-6898&#xff0c;FTP端口6821&#xff0c;苏标主动安全附件…

[GESP样题 四级] 绝对素数

B3939 [GESP样题 四级] 绝对素数 题目 如果一个两位数是素数&#xff0c;且它的数字位置经过对换后仍为素数&#xff0c;则称为绝对素数&#xff0c;例如 13。给定两个正整数 A, B&#xff0c;请求出大于等于 A&#xff0c;小于等于 B 的所有绝对素数。 输入 1 行&#xff0…

LPDDR5电路设计的新功能

最近因为需要使用到LPDDR5&#xff0c;快速地浏览了JEDEC标准文档&#xff0c;发现与前几代相比出现了一些新的电路设计功能&#xff0c;总结为如下三点&#xff1a; 1. CK/WCK/RDQS时钟方案&#xff1b; 2. 电源的PDN设计目标&#xff1b; 3. DQ, DMI和RDQS的Rx端DFE均衡技术。…

便宜的智能组网系统有哪些?

随着物联网的迅猛发展&#xff0c;智能设备的普及与应用也日益增多。不同地区的智能设备之间的互联通信仍然存在着很多困难和挑战。其中一个主要问题是如何实现便宜而高效的智能组网。在这篇文章中&#xff0c;我们将介绍一款名为【天联】的组网产品&#xff0c;它是北京金万维…

《TAM》论文笔记(上)

原文链接 [2005.06803] TAM: Temporal Adaptive Module for Video Recognition (arxiv.org) 原文代码 GitHub - liu-zhy/temporal-adaptive-module: TAM: Temporal Adaptive Module for Video Recognition 原文笔记 What&#xff1a; TAM: Temporal Adaptive Module for …

AXI4读时序在AXI Block RAM (BRAM) IP核中的应用

在本文中将展示描述了AXI从设备&#xff08;slave&#xff09;AXI BRAM Controller IP核与Xilinx AXI Interconnect之间的读时序关系。 1 Single Read 图1展示了一个从32位BRAM&#xff08;Block RAM&#xff09;进行AXI单次读取操作的时序示例。 图1 AXI 单次读时序图 在该…

555555

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 人工智能与机器学习 &#x1f4dd;人工智能相关概念☞什么是人工智能、机器学习、深度学习☞人工智能发…

【二次元MMORPG游戏开发】任务系统技术拆解

引言 各位同学大家好。在今天的分享当中&#xff0c;我将对任务系统去做一个拆解。也许你见过很多任务系统&#xff0c;但是今天我要分享的是我们经过一个框架迭代以后的任务系统。我会结合客户端的功能演示给大家去讲解。 跟着演示学开发 基本操作 好&#xff0c;首先我们点…

STM32 ADC学习

ADC Analog-to-Digital Converter&#xff0c;即模拟/数字转换器 常见ADC类型 分辨率和采样速度相互矛盾&#xff0c;分辨率越高&#xff0c;采样速率越低。 ADC的特性参数 分辨率&#xff1a;表示ADC能辨别的最小模拟量&#xff0c;用二进制位数表示&#xff0c;比如8,10…

clickhouse学习笔记06

ClickHouse的建表和引擎选择思路讲解 ClickHouse的常见注意事项和异常问题排查 ClickHouse高性能查询原因剖析-稀疏索引 ClickHouse高性能写入剖析-LSM-Tree存储结构

【每日力扣】98. 验证二叉搜索树 与 108. 将有序数组转换为二叉搜索树

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 98. 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&a…