表单设计器附件的上传、显示和下载

简介: 表单设计器附件的上传、显示和下载

本文采用开源的form-generator和element-ui,相关技术可以参考下面的链接

form-generator: https://github.com/JakHuang/form-generator

element-ui: https://element.eleme.cn//#/zh-CN/component/installation

修改组件render.js

function vModel(dataObject, defaultValue)增加下面文件

//获取上传表单元素组件 上传// add by nbacheng 2022-07-19的文件
  if (this.conf.__config__.tag === 'el-upload') {
    // 上传表单元素组件 的成功和移除事件;
    dataObject.attrs['on-success'] = (response, file, fileList) => {
      this.$emit('upload', response, file, fileList)
    }

    dataObject.attrs['on-remove'] = (file, fileList) => {
      this.$emit('deleteUpload', file, fileList)
    }

    dataObject.attrs['on-preview'] = (file) => {
      this.$emit('download', file)
    }
    return
  }
  // add by nbacheng 2022-07-19

同时在组件Parser增加下面内容

function buildListeners(scheme) {
  const config = scheme.__config__
  const methods = this.formConf.__methods__ || {}
  const listeners = {}

  // 给__methods__中的方法绑定this和event
  Object.keys(methods).forEach(key => {
    listeners[key] = event => methods[key].call(this, event)
  })
  // 响应 render.js 中的 vModel $emit('input', val)
  listeners.input = event => setValue.call(this, event, config, scheme)
  //上传表单元素组件的成功和移除事件; // add by nbacheng 2022-07-19
  listeners.upload = (response, file, fileList) => setUpload.call(this, config, scheme,response, file, fileList)
  listeners.deleteUpload = (file, fileList) => deleteUpload.call(this, config, scheme,file, fileList)
  //listeners.download = (file) => download.call(this, file)
  // add by nbacheng 2022-07-19
  return listeners
}

//获取上传表单元素组件 上传的文件 // add by nbacheng 2022-07-19
function setUpload(config, scheme, response, file, fileList) {
  //response: 上传接口返回的数据sponse}
  var filename=response.message.substring(response.message.lastIndexOf('/')+1)  //获取文件名称
  let fileObj = {name: filename, url: response.message}
  let oldValue = JSON.parse(this[this.formConf.formModel][scheme.__vModel__])
  console.log("setUpload response=",response)
  if (oldValue) {
    oldValue.push(fileObj)
  } else {
    oldValue = [fileObj]
  }
  console.log("setUpload oldValue=",oldValue)
  this.$set(config, 'defaultValue', JSON.stringify(oldValue))
  this.$set(this[this.formConf.formModel], scheme.__vModel__, JSON.stringify(oldValue))
}
//获取上传表单元素组件 删除文件后的文件列表
function deleteUpload(config, scheme, file, fileList) {
  let oldValue = JSON.parse(this[this.formConf.formModel][scheme.__vModel__])

  //file 删除的文件
  //过滤掉删除的文件
  let newValue = oldValue.filter(item => item.name !== file.name)
  this.$set(config, 'defaultValue', JSON.stringify(newValue))
  this.$set(this[this.formConf.formModel], scheme.__vModel__, JSON.stringify(newValue))
}


//点击进行下载文件
function download(file) {
  var a = document.createElement('a');
  var event = new MouseEvent('click');
  a.download = file.name;
  a.href = file.url;
  a.dispatchEvent(event);
}
// add by nbacheng 2022-07-19

同时在下面的初始化Form数据里增加token

initFormData(componentList, formData) {
      componentList.forEach(cur => {
        const vModel = cur.__vModel__
        const val = formData[vModel]
        const config = cur.__config__
        if (config.tag === 'el-upload') {
          // 如果需要token,可以设置 
          const token = Vue.ls.get(ACCESS_TOKEN);
          cur['headers'] = {"X-Access-Token":token};
        }  
        if (cur.__vModel__) {
            formData[cur.__vModel__] = config.defaultValue
        }
        if (config.children) this.initFormData(config.children, formData)
      })
    },

同时在自己需要显示的页面上增加

<div style="margin-left:10%;margin-bottom: 20px">
           <!--对上传文件进行显示处理,临时方案 add by nbacheng 2022-07-27 -->
           <el-upload :on-preview="handleFilePreview" :file-list="fileList" v-if="fileDisplay" />
 </div>

mounted() {
      //表单数据回填,模拟异步请求场景
      setTimeout(() => {
        // 回填数据,这里主要是处理文件显示
        this.fillFormData(this.variablesData.fields, this.variablesData)
        // 更新表单
        this.key = +new Date().getTime()
      }, 1000)
    },

fillFormData(fields, formConf) {
        const { formModel, formRef } = formConf
        fields.forEach((item, i) => {
          const vModel = item.__vModel__
          const val = item.__config__.defaultValue 
          // 特殊处理el-upload,包括 回显图片
          if (item.__config__.tag === 'el-upload') {
            
            // 回显图片
            console.log("fillFormData val=",JSON.parse(val))
            this.fileDisplay = true
            console.log('item=',item['list-type'])
            if(item['list-type'] != 'text') {
              this.fileList = ''    //隐藏加的el-upload文件列表
              item['file-list'] = JSON.parse(val)
            }
            else {  //图片
              this.fileList = JSON.parse(val)
              item['file-list'] = '' //隐藏加的表单设计器的文件列表
            }
            
          }
          // 设置各表单项的默认值(回填表单),包括el-upload的默认值
          if (val) {
            item.__config__.defaultValue = val
          }
          if (Array.isArray(item.__config__.children)) {
            this.fillFormData(item.__config__.children, formConf)
          }
        })
      },

//点击文件列表中已上传文件进行下载
      handleFilePreview(file) {
        var a = document.createElement('a');
        var event = new MouseEvent('click');
        a.download = file.name;
        a.href = file.url;
        a.dispatchEvent(event);
        console.log(file)
      },

image.png

image.png

具体实现可以见我的开源项目

gitee源代码地址

后端代码: https://gitee.com/nbacheng/nbcio-boot

前端代码:https://gitee.com/nbacheng/nbcio-vue.git


相关文章
|
6月前
|
JavaScript 前端开发 数据库
如何实现在表单中有多个附件,想实现不同的附件发送给不同指定人员
如何实现在表单中有多个附件,想实现不同的附件发送给不同指定人员
152 0
针对FastAdmin新增上传多个图片,新增上传的视频的预览效果
针对FastAdmin新增上传多个图片,新增上传的视频的预览效果
856 0
|
存储 PHP 数据安全/隐私保护
Ueditor结合七牛云存储上传图片、附件和图片在线管理的实现和最新更新
最新下载地址: https://github.com/widuu/qiniu_ueditor_1.4.3 Ueditor七牛云存储版本 注意事项 老版本请查看 : https://github.com/widuu/qiniu_ueditor_1.
3114 0
|
1月前
|
监控 前端开发 安全
C#一分钟浅谈:文件上传与下载功能实现
【10月更文挑战第2天】在Web应用开发中,文件的上传与下载是常见需求。本文从基础入手,详细讲解如何在C#环境下实现文件上传与下载。首先介绍前端表单设计及后端接收保存方法,使用`&lt;input type=&quot;file&quot;&gt;`与`IFormFile`接口;接着探讨错误处理与优化策略,如安全性验证和路径管理;最后讲解文件下载的基本步骤,包括确定文件位置、设置响应头及发送文件流。此外,还提供了进阶技巧,如并发处理、大文件分块上传及进度监控,帮助开发者构建更健壮的应用系统。
95 15
|
3月前
|
Web App开发 Linux Windows
解决Markdown文件上传至CSDN无法显示本地图片问题-白嫖版,分享给别人的md文件图片不显示的解决方案
解决Markdown文件上传至CSDN无法显示本地图片问题-白嫖版,分享给别人的md文件图片不显示的解决方案
|
4月前
|
存储
文本-----富文本图片上传手工资料(上)实现图片上传和下载简单代码
文本-----富文本图片上传手工资料(上)实现图片上传和下载简单代码
实现手动上传表单数据+图片文件
在很多项目中都会有上传数据+图片的需求,我最近在项目中负责活动发布的板块,需要几个表单数据加两个图片和一个图片数组,我看到产品需求后头就很大,我之前没有做过相关的业务,所以这几天一直在尝试,看到接口文档我内心已经崩了。
161 1
实现手动上传表单数据+图片文件
|
移动开发 JSON 前端开发
前端H5选图预览到上传
在金融性质的App里,选择本地相册图片或者拍照,然后预览并且上传是一个典型的使用场景,比如常见的身份证信息上传。在最近接触的几家银行客户里,都反馈有类似的场景,并且在使用上都或多或少的遇到一些问题,最后找到我们,希望我们提供一些最佳实践。在这里分享下对应场景的一些优化解决方案。
402 0
前端H5选图预览到上传
利用微搭低代码实现附件的上传和下载
利用微搭低代码实现附件的上传和下载
利用微搭低代码实现附件的上传和下载
|
移动开发 JSON 前端开发
mPaaS H5选图预览到上传怎么做
在金融性质的App里,选择本地相册图片或者拍照,然后预览并且上传是一个典型的使用场景,比如常见的身份证信息上传。在最近接触的几家银行客户里,都反馈有类似的场景,并且在使用上都或多或少的遇到一些问题,最后找到我们,希望我们提供一些最佳实践。在这里分享下对应场景的一些优化解决方案。
257 0
mPaaS H5选图预览到上传怎么做