Vue3 文件上传增加对文件的描述字段 el-upload

实现效果:因为文件上传使用的是element 的upload组件,现在甲方要求对每个文件要有对应的描述,一个方法是修改element组件的源码,比较繁琐,因此自定义一个fileList的数组,用于已上传文件的列表展示,将el-upload组件的文件列表进行隐藏,以此达到为文件添加描述的效果。

html部分:

首先使用ul,li进行fileList的for循环,进行文件展示,可在此处自定义想要的展示效果。

之后为el-upload组件设置:show-file-list="false",隐藏其文件列表

<template>
  <el-button @click="tanchaung">按钮</el-button>
  <el-dialog v-model="tcxianshi" width="60%">
    <el-form :model="formState" ref="ruleFormRef1" :rules="rules">
      <el-form-item label="文件:" label-width="100px" prop="laplTime">
        <div class="fileFormItem">
          <ul class="fileListUl">
            <li class="fileListLi" v-for="item in fileList" :key="item.url">
              <div class="fileNameDiv" @click="handlePreview(item)">
                <img src="../assets/icon/file.svg" style="width: 1em; height: 1em;">
                {{ item.name }}
              </div>
              <div class="fileDesDiv">
                <span class="fileDesSpan">文件描述:</span>
                <el-input
                  class="input11"
                  v-model="item.descript"
                ></el-input>
              </div>
              <div class="deleteIcon" @click="deleteFile(item)">
                删除
              </div>
            </li>
          </ul>
          <el-upload
            v-model:file-list="fileList"
            class="upload-demo"
            action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
            multiple
            :on-preview="handlePreview"
            :on-remove="handleRemove"
            :before-remove="beforeRemove"
            :on-success="handleSuccess"
            :limit="3"
            :on-exceed="handleExceed"
            :show-file-list="false"
          >
            <el-button type="primary">点击上传</el-button>
            <template #tip>
              <div class="el-upload__tip">
                <!-- jpg/png files with a size less than 500KB. -->
              </div>
            </template>
          </el-upload>
        </div>
      </el-form-item>
    </el-form>
  </el-dialog>
</template>

js部分:

// 数据定义
let data = reactive({
  formState: {}, // 表单状态数据
});

// 引用定义
const ruleFormRef1 = ref(); // 表单引用
let tcxianshi = ref(false); // 控制对话框显示状态

// 方法定义
function tanchaung() {
  tcxianshi.value = true; // 显示对话框
}

// 文件列表数据定义
const fileList = ref([
  {
    name: "element-plus-logo.svg",
    url: "https://element-plus.org/images/element-plus-logo.svg",
    descript: "", // 文件描述
  },
  {
    name: "element-plus-logo2.svg",
    url: "https://element-plus.org/images/element-plus-logo.svg",
    descript: "", // 文件描述
  },
]);

// 表单校验规则定义
const rules = reactive({
  planName: [{ required: true, message: "请输入计划名", trigger: "blur" }],
});

// 删除文件方法
function deleteFile(val){
  console.log('当前删除文件', val);
  console.log('当前存在文件', fileList.value);
  var length = fileList.value.length;
    for (var i = 0; i < length; i++) {
        if (fileList.value[i].uid == val.uid) {
          fileList.value.splice(i, 1); //删除下标为i的元素
          return fileList.value;
        }
    }
    console.log('当前存在文件', fileList.value);
};

// 处理文件删除事件
const handleRemove = (file, uploadFiles) => {
  console.log(file, uploadFiles);
  console.log("handleRemove  fileList已有文件", fileList.value);
};

// 处理文件预览事件
const handlePreview = (uploadFile) => {
  console.log(uploadFile);
  console.log("handlePreview  fileList已有文件", fileList.value);
};

// 处理文件超出限制事件
const handleExceed = (files, uploadFiles) => {
  ElMessage.warning(
    `The limit is 3, you selected ${files.length} files this time, add up to ${
      files.length + uploadFiles.length
    } totally`
  );
};

// 文件删除前的确认操作
const beforeRemove = (uploadFile, uploadFiles) => {
  return ElMessageBox.confirm(
    `确认删除 ${uploadFile.name} ?`
  ).then(
    () => true,
    () => false
  );
};

// 文件上传成功后的处理
const handleSuccess = (file, uploadFiles) => {
  console.log("上传成功 ", file, uploadFiles);
  console.log("handleSuccess  fileList已有文件", fileList.value);
  ElMessage({
    message: '上传成功',
    type: 'success',
  })
  fileList.value[fileList.value.length - 1].descript = "";
};

// 解构获取响应式数据
let { formState } = toRefs(data);
  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中使用`el-upload`上传图片到Django服务器,可以按照以下步骤进行: 1. 安装`axios`,用来发送请求: ``` npm install axios ``` 2. 在Vue组件中引入`el-upload`和`axios`: ```javascript <template> <el-upload action="/your-upload-url/" :before-upload="beforeUpload" :on-success="handleSuccess" :on-error="handleError" :limit="1" :auto-upload="false"> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过2MB</div> </el-upload> </template> <script> import axios from 'axios'; export default { methods: { // 上传前的校验 beforeUpload(file) { const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'; const isLt2M = file.size / 1024 / 1024 < 2; if (!isJpgOrPng) { this.$message.error('上传头像图片只能是 JPG/PNG 格式!'); } if (!isLt2M) { this.$message.error('上传头像图片大小不能超过 2MB!'); } return isJpgOrPng && isLt2M; }, // 上传成功后的处理 handleSuccess(response) { this.$message.success('上传成功'); }, // 上传失败后的处理 handleError(error) { this.$message.error('上传失败'); } } } </script> ``` 3. 在Django中,需要安装`django-cors-headers`用来处理跨域问题。在`settings.py`中进行配置: ```python INSTALLED_APPS = [ # ... 'corsheaders', # ... ] MIDDLEWARE = [ # ... 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', # ... ] CORS_ORIGIN_ALLOW_ALL = True ``` 4. 在Django中编写处理文件上传的视图函数: ```python from django.http import JsonResponse def upload(request): if request.method == 'POST': file = request.FILES.get('file') # 处理上传的图片文件,比如存储在某个目录下或者存储在数据库中 # 返回处理结果 return JsonResponse({'success': True}) else: return JsonResponse({'success': False, 'message': '请求方法不正确'}) ``` 5. 在前端组件中设置`el-upload`的`action`属性为Django中处理文件上传的URL,比如`/upload/`。同时,还需要在请求头中添加`X-CSRFToken`字段,以防止`CSRF`攻击: ```javascript <el-upload action="/upload/" :before-upload="beforeUpload" :on-success="handleSuccess" :on-error="handleError" :limit="1" :auto-upload="false" :headers="{'X-CSRFToken': csrfToken}"> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过2MB</div> </el-upload> ``` 其中,`csrfToken`可以在Vue组件中设置为: ```javascript import Cookies from 'js-cookie'; export default { data() { return { csrfToken: Cookies.get('csrftoken') } } } ``` 这样就可以使用`el-upload`上传图片到Django服务器了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值