上传文件(vue3)

使用el-upload 先上传到文件服务器,生成url

然后点击确定按钮: 保存数据

javascript 复制代码
<template>
  <el-dialog top="48px" width="500" title="新增协议" :modelValue="visible" @close="handleClose()">
    <div class="form-main">
      <el-form
        ref="ruleFormRef"
        :model="ruleForm"
        label-width="90px"
        class="demo-ruleForm"
        status-icon
      >
        <el-form-item
          label="协议名称: "
          prop="agreementName"
          :rules="[
            {
              required: true,
              message: '请输入协议名称',
              trigger: 'blur'
            },
            {
              message: '最多20个字符',
              trigger: 'blur',
              max: 20
            }
          ]"
        >
          <el-input v-model="ruleForm.agreementName" placeholder="请输入协议名称" />
        </el-form-item>
        <el-form-item
          label="协议文件: "
          prop="fileUrl"
          :rules="{
            required: true,
            message: '请选择协议文件',
            trigger: 'blur'
          }"
        >
          <div>
            <el-upload
              ref="uploadRef"
              class="upload-demo"
              :on-change="beforeUpload"
              :auto-upload="false"
              :show-file-list="false"
            >
              <template #trigger>
                <div class="upBtn">{{ fileName == "" ? "协议文件" : fileName }}</div>
              </template>
              <div class="div-desc">支持上传pdf文件</div>
            </el-upload>
          </div>
        </el-form-item>
      </el-form>
    </div>
    <template #footer>
      <el-button @click="handleClose()">取消</el-button>
      <el-button type="primary" @click="confirm(ruleFormRef)">确定</el-button>
    </template>
  </el-dialog>
</template>

<script setup lang="ts">
import type { FormInstance } from "element-plus"
import { addAgreementManage } from "@/api/agreementManage"
import { uploadFile } from "@/api/common"
import { uploadCodeStr } from "@/types/common"
defineProps({
  visible: {
    type: Boolean,
    default: false
  }
})
const ruleFormRef = ref<FormInstance>()
const ruleForm = ref({
  agreementName: "",
  fileUrl: ""
}) as any
const emits = defineEmits(["closeDialog"])
const handleClose = (getData?: any) => {
  ruleForm.value = {
    agreementName: "",
    fileUrl: ""
  }
  fileName.value = ""
  nextTick(() => {
    ruleFormRef.value?.resetFields()
  })
  emits("closeDialog", getData ? true : false)
}
// 确定按钮
const confirm = async (formEl: FormInstance | undefined) => {
  if (!formEl) return
  await formEl.validate((valid, fields) => {
    if (valid) {
      addAgreementManage({
        agreementName: ruleForm.value.agreementName,
        fileUrl: ruleForm.value.fileUrl
      }).then((res: any) => {
        if (res.code == 200) {
          ElMessage.success(res.msg)
          handleClose(true)
        } else {
          ElMessage.error(res.msg)
        }
      })
    } else {
      console.log("error submit!", fields)
    }
  })
}
// 上传文件
const beforeUpload = (file: any) => {
  // 判断文件类型
  const isPDF = file.raw.type === "application/pdf"
  if (!isPDF) {
    ElMessage.error("上传文件只能是 PDF 格式!")
    return
  }
  const isLt2M = file.size / 1024 / 1024 < 10
  if (!isLt2M) {
    ElMessage.error("上传文件大小不能超过 10MB!")
    return
  }
  upload(file)
}
let fileName = ref("")
// 上传文件
const upload = async (file: any) => {
  try {
    let { code, data } = await uploadFile({
      multipartFile: file.raw,
      code: uploadCodeStr
    })
    if (code && code == 200) {
      ruleForm.value.fileUrl = data.relativePath
      nextTick(() => {
        ruleFormRef.value?.validate()
      })
      fileName.value = file.raw.name
    } else {
      ElMessage.error("上传失败")
    }
  } catch (error) {
    // ElMessage.error("上传失败")
  }
}
</script>

<style scoped lang="scss">
.form-main {
  .upBtn {
    color: #409eff;
    cursor: pointer;
  }
}
.div-desc {
  width: 100%;
  color: #909399;
  font-size: 12px;
  margin-top: -10px;
}
</style>

二 查看协议

因为是个URL 直接打开就可以

javascript 复制代码
  /**
   * 预览协议
   */
  const goPreview = (row: any) => {
    //新页面打开
    window.open(row.fileUrl)
    // window.open(configLlocation.filePathUrl + row.fileUrl)
  }
相关推荐
衍辉channel2 分钟前
衍辉AI速递 10.14|谷歌发布Gemini 4 Argon模型等9条AI资讯
javascript
vipxieliang7 分钟前
JavaScript 事件循环与任务队列:从 setTimeout 到 Promise
前端·javascript
Misnearch1 小时前
React中的回调
前端·javascript·react.js
顽疲2 小时前
Java vue 养老系统源码详解:入住核算单 live-check 缴费入账与预交金收据实践
java·vue.js·python·java 养老·springboot 养老·vue养老
Eider19982 小时前
大模型输出格式幻觉解决思路
开发语言·前端·javascript
志尊宝3 小时前
Vue3 零基础每日笔记(085):项目上线前 Checklist——环境变量、报错监控、安全自查
前端·javascript·笔记·安全·信息可视化·echarts
志尊宝3 小时前
Vue3 零基础每日笔记(088·完结):从零到一——一个完整 Vue3 项目的成长复盘
前端·javascript·vue.js·笔记·ecmascript·#vue.js
传人once3 小时前
企业官网静态页基础结构如何搭
javascript·css
桔筐3 小时前
Vue中DOM的data-*自定义属性(dataset)与Vue data响应式变量区别详解
前端·javascript·vue.js
damoluomu3 小时前
静态站点生成器怎么选:Node.js 生态里常用的五个(番外一)
javascript·css·typescript·node.js·html