bootstrap-fileinput(二:编辑(修改)界面文件的上传,回显,删除(数据库同时删除)的操作 )

news2025/1/29 13:54:42

文章目录

  • bootstrap-fileinput(二:编辑(修改)界面文件的上传,回显,删除(数据库同时删除)的操作 )
  • 一、编辑界面文件的上传
  • 二、编辑界面文件的回显
    • 1.文件的实体类:
    • 2.想要回显文件,首先要在工程类(你的编辑界面的主类)里面关联文件类
    • 3.进行文件的回显
  • 三.文件的删除


bootstrap-fileinput(二:编辑(修改)界面文件的上传,回显,删除(数据库同时删除)的操作 )

说在前面:

文件编辑的坑是真的多,在我反复摸索跟看别人的代码以后自己终于完成,这里给你们分享一下心得,编写不易,希望小伙伴们多多点赞!

一、编辑界面文件的上传

这个跟add界面的文件上传大同小异
1.首先引入js

<th:block th:include="include :: bootstrap-fileinput-css"/>
<th:block th:include="include :: bootstrap-fileinput-js"/>

2.引入标签

<div class="file-loading">
      <input id="singleFile" name="file" type="file">
</div>

引入隐藏域

<input type="hidden" name="fjid" id="fjid">

3.引入js

<!--资料的实现-->
        //单文件上传

        $(document).ready(function(){
            $("#singleFile").fileinput({
                uploadUrl: prefix + "/upload",//文件上传路
                dropZoneTitle: '可以将文件拖放到这里,支持文件上传',
                language: 'zh',
                allowedFileExtensions: ['bmp', 'gif', 'jpg', 'jpeg', 'png', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx','html', 'htm', 'txt', 'text','rar', 'zip', 'gz', 'bz2', 'pdf', 'bpmn', 'bar','db'],
                showUpload: true,//是否显示上传按钮
                showRemove : true, //显示移除按钮
                showPreview : true, //是否显示预览
                showCaption: false,//是否显示标题
                fileSizeGetter: true,
                previewFileType: ['image','txt','text'],
                validateInitialCount:true,
                preferIconicPreview: true, // 这将强制缩略图按照以下文件扩展名的图标显示
                maxFileCount: 1,
                autoReplace: true//自动替换
                //下面的自动上传提交,建议先熟悉下面的文件点击上传
            }).on('filebatchselected',function(event,data,previewId,index){
                $(this).fileinput("upload");
                document.getElementById('fjid').value = rsp.fjid;
                log.info("return url:" + rsp.url)
                log.info("return fileName:" + rsp.fileName)
                log.info("return newFileName:" + rsp.newFileName)
                log.info("return originalFilename: " + rsp.originalFilename)
                //文件上传提交,后台返回数据前台接受
            }).on('fileuploaded',function(event,data,previewId,index) {
            	//后台返回的数据,是一个json数据,里面是个map集合
                var rsp = data.response;
                //把后台返回的fjid的值赋给隐藏于的fjid属性
                document.getElementById('fjid').value = rsp.fjid;
                log.info("return url:" + rsp.url)
                log.info("return fileName:" + rsp.fileName)
                log.info("return newFileName:" + rsp.newFileName)
                log.info("return originalFilename: " + rsp.originalFilename)
            }).on('fileremoved',function (event, id, index){
                $("input[name='" + event.currentTarget.id +"']").val('')
            })
        });

后台代码:

/**
     * 资料上传请求(单个)
     * @return
     */
    @PostMapping("/upload")
    @ResponseBody
    public AjaxResult uploadFile(MultipartFile file) throws Exception {
        try {
            // 上传文件路径
            String filePath = RuoYiConfig.getUploadPath();
            // 上传并返回新文件名称
            String fileName = FileUploadUtils.upload(filePath, file);
            //获取文件的上传路径
            String url = serverConfig.getUrl() + fileName;
            //得到文件的文件名
            String[] split = fileName.split("/");
            String fname = split[split.length - 1];

            PmsFujian pmsFujian = new PmsFujian();
            pmsFujian.setUrl(url);
            pmsFujian.setName(fname);
            pmsFujian.setCssize(file.getSize());
            pmsFujian.setCsname(file.getOriginalFilename());
            pmsFujian.setMkmc("工程资料");
            pmsFujianService.insertPmsFujian(pmsFujian);
            String fjid = pmsFujian.getFjid();
            AjaxResult ajax = new AjaxResult();
            ajax.put("url",url);
            ajax.put("name", fname);
            ajax.put("fjid",fjid);
            ajax.put("fileName", fileName);
            return ajax;
        } catch (Exception e) {
            return AjaxResult.error(e.getMessage());
        }
    }

然后调用工程的编辑方法

 /**
     * 修改保存工程
     */
    @RequiresPermissions("common:gongcheng:edit")
    @Log(title = "工程", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
    @ResponseBody
    public AjaxResult editSave(PmsGongcheng pmsGongcheng,String fjid) {
        return toAjax(pmsGongchengService.updatePmsGongcheng(pmsGongcheng,fjid));
    }

updatePmsGongcheng 里面的方法执行过程

/**
     * 修改工程
     * 
     * @param pmsGongcheng 工程
     * @return 结果
     */
    @Override
    public int updatePmsGongcheng(PmsGongcheng pmsGongcheng,String fjid,String jcfa)
    {	//先更新工程数据库中的信息
    	int i =  pmsGongchengMapper.updatePmsGongcheng(pmsGongcheng);
    	//判断是否传入了新文件
    	if (!fjid.isEmpty()) {
            String gcid = pmsGongcheng.getGcid();
            PmsFujian pmsFujian = pmsFujianMapper.selectPmsFujianByFjid(fjid);
            pmsFujian.setGlid(gcid);
            pmsFujianMapper.updatePmsFujian(pmsFujian);
        }
        return i;
    }

这样就完成了文件上传

二、编辑界面文件的回显

1.文件的实体类:

 /** 附件主键 */
    private String fjid;
    /** 名称 */
    @Excel(name = "名称")
    private String name;
    /** 路径 */
    @Excel(name = "路径")
    private String url;
    /** 关联主键 */
    @Excel(name = "关联主键")
    private String glid;
    /** 模块名称 */
    @Excel(name = "模块名称")
    private String mkmc;
    /** 文件大小 */
    @Excel(name = "文件大小")
    private String size;
    /** 文件大小(不加计算) */
    @Excel(name = "文件大小", readConverterExp = "不=加计算")
    private Long cssize;
    /** 文件初始名称 */
    @Excel(name = "文件初始名称")
    private String csname;

2.想要回显文件,首先要在工程类(你的编辑界面的主类)里面关联文件类

public class PmsGongcheng extends BaseEntity {
/**
    * 附件类 xyh
    * */
    private List<PmsFujian> pmsFujian;
    ...生成你的get,set方法和你的tostring

xml中使用collection标签

<collection property="pmsFujian"  column="fjid" ofType="com.lrkj.pms.ztjg.common.domain.PmsFujian" resultMap="PmsFujianResult"/>

在主类的xml文件引入文件的sql

<resultMap type="com.lrkj.pms.ztjg.common.domain.PmsFujian" id="PmsFujianResult">
        <result property="fjid"    column="fjid"    />
        <result property="name"    column="name"    />
        <result property="url"    column="url"    />
        <result property="glid"    column="glid"    />
        <result property="mkmc"    column="mkmc"    />
        <result property="size"    column="size"    />
        <result property="cssize"    column="cssize"    />
        <result property="csname"    column="csname"    />
        <result property="createTime"    column="create_time"/>
        <result property="remark"    column="remark"    />
    </resultMap>

3.进行文件的回显

1.首先文件的回显需要这几个东西:

initialPreview: initialPreview,
initialPreviewConfig: initialPreviewConfig,
initialPreviewAsData: true, // 默认为数据

上面的bootstrap-fileinput文件控件里面自带的属性,把这三个属性放到$(“#singleFile”).fileinput({})里面

2.编写js代码,实现initialPreview和initialPreviewConfig的实现逻辑:

var pmsFujian = [[${pmsGongcheng.pmsFujian}]];

            var initialPreview = [];

            var initialPreviewConfig = [];

            if(pmsFujian[0].fjid == null){
                pmsFujian = [];
            }
            if(pmsFujian != null && pmsFujian != ''){
                for(var i = 0;i<pmsFujian.length;i++) {
       				var Fujian = pmsFujian[i];
                    if(Fujian != null && Fujian !=''){
                        var delFujian = new Object();
                        delFujian = generFilDel(Fujian);
                        //把文件的路径传到这个数组里面
                        initialPreview.push(Fujian.url);
                        //把文件的信息传到这个数组里面
                        initialPreviewConfig.push(delFujian);
                    }
                }
            }
//这个是判断文件属性的配置类,包含了文件的各种属性,其中url是文件的删除路径,必须要写入,与后台删除路径保持一致,key是文件删除时带到后台的ajax数据,在后台接收的是key不是fjid
            
function generFilDel(file) {
    if(file != null && file != ''){
        var type = file.url.substr(file.url.lastIndexOf('.') + 1);
        if(type=='pdf'){
				return {type: "pdf", size: file.cssize, caption: file.csname, url:prefix + "/deletePic", key: file.fjid, downloadUrl:file.url};
	    }else if(type=='text'){
				return {caption: file.csname, type: "text", size: file.cssize, url:prefix + "/deletePic", key: file.fjid , downloadUrl:file.url};
		}else if(type=='mp4'){
				return  {type: "video", size: file.cssize, filetype: "video/mp4", caption: file.csname, url:prefix + "/deletePic", key: file.fjid , downloadUrl:file.url};
		}else if(type=='txt'){
				return  {type: "txt", size: file.cssize, caption: file.csname, url:prefix + "/deletePic", key: file.fjid , downloadUrl:file.url};
		}else if(type=='db'){
				return  {type: "db", size: file.cssize, caption: file.csname, url:prefix + "/deletePic", key: file.fjid , downloadUrl:file.url};
	    }else{
				return	{caption: file.csname, size: file.cssize, url: prefix + "/deletePic", key: file.fjid};
			  }
		}
     }

此时,就完成了文件的回显:
在这里插入图片描述
回显的预览界面:
在这里插入图片描述

三.文件的删除

文件删除直接调用bootstrap里面的filesuccessremove方法

on('filesuccessremove',function(event,data,previewId,index){
			    for (var i = 0; i < pmsFujian.length; i++) {
                    if (pmsFujian[i].fjid == data) {
                    delete pmsFujian[i];
                    }
                  }

因为咱们在initialPreviewConfig传入了删除路径和删除时所带的文件id,所以先配置好js代码:

$("#singleFile").fileinput({
//添加文件的删除路径
                deleteUrl: prefix + "/deletePic",

后台代码:

/**
     *删除文件
     *
     */
    @PostMapping("/deletePic")
    @ResponseBody
    //传入从前台过来的key
    public AjaxResult delete(String key){
        return toAjax(pmsFujianService.deletePmsFujianByFjid(key));
    }

这样就实现了前端实现文件移除时后端也删除了文件数据库中对应的文件信息

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

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

相关文章

ES6面试问题汇总

面试官通过总问题&#xff0c;ES6方法开始提问 1.ES6有哪些新增方法&#xff1f;/你了解哪些ES6方法&#xff1f;&#xff08;总问题&#xff09; 块级作用域、 模板字符串、 解构赋值、 箭头函数、 函数默认参数、 剩余参数&运算符、 set和map、 import和exprot用…

Vue中实现过渡动画

文章目录Vue的transition动画Transition动画的使用Transition组件的原理Transition动画的classVue的animation动画Animation动画的使用同时设置两种动画(了解)过渡的模式mode列表过渡列表过渡的介绍列表过渡的使用Vue的transition动画 Transition动画的使用 在开发中&#xf…

vite配置cdn优化打包体积

文章目录前言一、版本确认二、使用步骤1.rollup-plugin-visualizer打包体积可视化面板2.配置cdn方法第一种方法&#xff1a; vite-plugin-cdn-import第二种方法&#xff1a; rollup-plugin-external-globals总结前言 大家都知道前端性能优化的方法&#xff0c;cdn外部引入的方…

【微信小程序】小程序知识补充篇

&#x1f381;写在前面&#xff1a; 观众老爷们好呀&#xff0c;这里是前端小刘不怕牛牛频道&#xff0c;小程序系列又更新了呀。 还有就是中秋节就快来啦&#xff0c;程序员过中秋&#xff0c;当然是要好好放松一下啦&#xff0c;那么中秋前我们就不能偷懒了&#xff0c;赶紧学…

Controller层接收前端传参的几种方法。@RequestParam、@RequestBody、@PathVariable。及参数校验。

一、RequestParam 主要用于将请求参数区域的数据映射到控制层方法的参数上 // http://localhost:8080/wh/user/edit?Id9452659856325148452&name天天向上// RequestParam源码Target({ElementType.PARAMETER}) // 只能作用于参数上 Retention(RetentionPolicy.RUNTIME) D…

vue watch监听数据解决新旧值一样的问题(newValue, oldValue)

watch是监听 Vue 实例变化的一个表达式或方法。回调函数得到的参数为新值和旧值。 基础用法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge…

异步函数async

什么是同步异步 在最新的ES7&#xff08;ES2017&#xff09;中提出的前端异步特性&#xff1a;async、await。 在了解async和await之前得先明白什么是同步函数&#xff0c;什么是异步函数。 同步函数&#xff1a;当一个函数是同步执行时&#xff0c;那么当该函数被调用时不会…

前端CryptoJS和Java后端数据互相加解密(AES)

目录一、序言二、关于前端CryptoJS1、CryptoJS简单介绍2、加密和填充模式选择3、前端AES加解密示例(1) cryptoutils工具类(2) 测试用例(3) 加解密后输出内容说明三、Java后端AES加解密1、Java中支持的加密模式和填充说明2、工具类CryptoUtils3、测试用例一、序言 最近刚好在做…

nodejs——解决跨域问题

目录 1什么是跨域 2解决 1 jsonp(缺点&#xff1a;不能请求post请求&#xff09; 1 index.html页 2 proxy.js页面 搭建一个服务器&#xff08;写好代码后&#xff0c;在cmd上启动&#xff09; 3效果 2服务端代理 &#xff08;由于后端请求不受浏览器同源策略影响&…

Bootstrap、栅格系统布局

一、Bootstrap Bootstrap是一个基于HTML、CSS和JavaScript语言编写的框架&#xff0c;具有简单、灵活的特性&#xff0c;拥有样式库、组件和插件。 Bootstrap常用来开发响应式布局和移动设备优先的Web项目&#xff0c;能够帮助开发者快速搭建前端页面。Bootstrap官方网站:Boot…

VUE3构建Cesium项目

目录 1.Cesium开发参考资料 2.VUE中使用Cesium 2.1 使用VUE创建项目 1.创建test项目 2.项目中引入Cesium 3.修改App.vue如下 4.将cesium静态文件复制至public下 5.运行效果 1.Cesium开发参考资料 Cesium官方网站&#xff1a;Cesium: The Platform for 3D Geospatial …

前端接收 type: “application/octet-stream“ 格式的数据并下载,解决后端返回不唯一

前端接收 type: “application/octet-stream“ 格式的数据并下载&#xff0c;还有后端既返回octet-stream还返回JSON数据时的处理方法 今天些项目的时候&#xff0c;后端改了一下文件下载的方式&#xff0c;打算用接口返回 type: “application/octet-stream“格式的数据&…

【微信小程序】全局配置

目录 全局配置文件及常用的配置项 全局配置 - window 1. 小程序窗口的组成部分 2. 了解 window 节点常用的配置项 3. 设置导航栏的标题 4. 设置导航栏的背景色 5. 设置导航栏的标题颜色 6. 全局开启下拉刷新功能 7. 设置下拉刷新时窗口的背景色 8. 设置下拉刷新时 lo…

echarts 柱状图滚动

实现效果&#xff1a;柱形图展示水平滚动条&#xff0c;并且鼠标滚动支持让滚动条平移 echarts文档里&#xff0c;图形的滚动条分两种 内置型 &#xff08;效果是&#xff1a; 鼠标在图中点击拖动平移&#xff0c;在图中滚动缩放&#xff09;滚动条型 &#xff08;效果是&…

高德地图自定义图标的点标记Marker--初体验(二)

点标记Marker创建一个默认图标的点标记:创建一个自定义图标的点标记:new AMap.Marker({}) 参数说明本文以Marker为主&#xff0c;其他点标记方法大差不差 通过上两篇文章我们已经了解到如何引入高德地图并进行初始化了&#xff0c;本文主要讲解普通点标记Marker,Marker 类型推荐…

框架获取当前登录用户以及用户信息

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 前言 &#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端中级工程师 &#x1f525; 三连支持&#xff1a;如果此文还不错的话&#xff0c;还请 ❤️关注、&…

设置浏览器显示小于12px以下字体的三种方法

使用场景&#xff1a; 以往设计图给的字号一般最小就是12px&#xff0c; 开发人员一般是使用谷歌浏览器来进行调试运行。 谷歌浏览器上显示字体最小为12px&#xff0c;css设置font-size&#xff1a;10px&#xff0c;运行代码显示结果仍然是12px大小&#xff0c;但是挡不住甲方…

TypeError The view function did not return a valid response. The function either returned None 的解决

使用flask框架制作登录、注册的页面时&#xff0c;app.py运行成功&#xff0c;数据库有用户&#xff0c;1234&#xff0c;密码也是1234 点击登录之后&#xff0c; 报如下错误。 TypeError TypeError: The view function did not return a valid response. The function either …

Vue3中的父传子和子传父如何实现

大家都知道Vue2中父传子是通过父组件绑定一个属性&#xff0c;子组件再用props进行接收&#xff0c;子传父是通过this.$emit那么Vue3中有什么不同呢&#xff1f;以下为您解答谜团 #Vue3的父传子 一.现在父组件调用子组件的时候,通过动态属性把数据传递过去 二.在子组件通过prop…

XSS漏洞及其原理(详解)

文章目录前言一、XSS漏洞原理1.概述2.利用方式3.执行方式4.攻击对象5.XSS危害&#xff08;1&#xff09;窃取cookie&#xff08;2&#xff09;未授权操作&#xff08;3&#xff09;传播蠕虫病毒6.简单代码7.XSS验证8.二、XSS漏洞分类1.反射型XSS原理特点举个栗子&#xff1a;2.…