前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >ElementUI 上传文件以及限制

ElementUI 上传文件以及限制

作者头像
py3study
发布于 2021-03-02 03:44:48
发布于 2021-03-02 03:44:48
4.5K00
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

一、概述

现有项目中,涉及文件上传。要求:

1. 文件必须是excel

2. 只能上传1个文件

3. 文件大小不能超过5M 

二、Upload 上传

注意:ElementUI Upload 上传,需要和后端api结合才能使用。

演示环境使用django,版本为:3.1.5

新建django项目

新建django项目,项目名为upload_demo,app名为api

 安装以下模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Django==3.1.5
djangorestframework==3.11.1
django-cors-headers==3.5.0

以上是我环境的版本,这里不做强制要求,安装最新版本即可。

注意:django-cors-headers是用来解决跨域问题的。

修改upload_demo/settings.py

注册app

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'api.apps.ApiConfig',
    'rest_framework',
    'corsheaders',  # 注册应用cors
]

中间件增加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'corsheaders.middleware.CorsMiddleware', # 注册组件cors
]

最后一行增加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#跨域增加忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
# CORS_ORIGIN_WHITELIST = (
#     'http://',
# )

CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
    'VIEW',
)

CORS_ALLOW_HEADERS = (
    'XMLHttpRequest',
    'X_FILENAME',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
    'Pragma',
)

修改api/views.py,增加视图函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework.views import APIView
from upload_demo import settings
from django.shortcuts import render, redirect, HttpResponse
from django.http import JsonResponse
from rest_framework import status
import os
import uuid


class File(APIView):
    def post(self, request):
        print(request.FILES)
        # 接收文件
        file_obj = request.FILES.get('file', None)
        print("file_obj", file_obj.name)

        # 判断是否存在文件夹
        head_path = os.path.join(settings.BASE_DIR,'upload')
        print("head_path", head_path)
        # 如果没有就创建文件路径
        if not os.path.exists(head_path):
            os.makedirs(head_path)

        # 判断文件大小不能超过5M
        if file_obj.size > 5242880:
            return JsonResponse({'status': status.HTTP_403_FORBIDDEN, 'msg': '文件过大'},
                                status=status.HTTP_403_FORBIDDEN)

        # 文件后缀
        suffix = file_obj.name.split(".").pop()
        print("文件后缀", suffix)  # 图片后缀 png

        # 判断文件后缀
        suffix_list = ["xlsx","xls"]
        if suffix not in suffix_list:
            return JsonResponse({'status': status.HTTP_403_FORBIDDEN, 'msg': '只能选择excel文件'},
                                status=status.HTTP_403_FORBIDDEN)

        # 重命名文件名
        file_name = '%s.%s'%(uuid.uuid4(),suffix)
        print("file_name",file_name)
        # 储存路径
        file_path = os.path.join(head_path,file_name)
        print("储存路径", file_path)

        # 写入文件到指定路径
        with open(file_path, 'wb') as f:
            for chunk in file_obj.chunks():
                f.write(chunk)

        data = {}
        data['name'] = file_name
        return JsonResponse({'status': status.HTTP_200_OK, 'data': data}, status=status.HTTP_200_OK)

修改upload_demo/urls.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib import admin
from django.urls import path
from api import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('file/excel_upload/',views.File.as_view())
]

启动django项目,访问链接为:http://127.0.0.1:8000/

新建vue测试页

安装axios

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install axios --save

test.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div style="width: 70%;margin-left: 30px;margin-top: 30px;">
    <el-upload ref="upload"
               class="upload-demo" :multiple='false' :auto-upload='true' list-type='text' :show-file-list='true'
               :before-upload="beforeUpload" :before-remove="beforeRemove" :drag='true' action='' :limit="1" :on-exceed="handleExceed"
               :http-request="uploadFile" accept=".xlsx" >
      <i class="el-icon-upload"></i>
      <div class="el-upload__text"><em>点击上传,仅限excel文件</em></div>
      <!--        <div class="el-upload__tip" slot="tip">仅限excel文件</div>-->
    </el-upload>
    <el-button type="primary" @click="onSubumit">提交</el-button>
  </div>
</template>

<script>
  // 导入模块
  import axios from 'axios'
  export default {
    components: {
      axios
    },
    data() {
      return {
        isUpload:false,  // 是否上传文件
      }
    },
    mounted: function() {
    },
    methods: {
      // 上传文件之前的钩子
      beforeUpload(file) {
        //判断文件格式
        let hz = file.name.split('.').pop()
        // console.log("hz",hz)
        if (hz != 'xlsx' && hz != 'xls') {
          this.$message.error(`只能选择excel文件`)
          return false
        }

        // 判断文件大小
        let fileSize = file.size / 1024 / 1024 < 5
        if (!fileSize) {
          this.$message.error('上传文件大小不能超过 5MB')
          return false
        }

        this.isUpload = true
      },

      // 删除文件之前的钩子
      beforeRemove(file){
        this.isUpload = false
      },

      // 上传文件个数超过定义的数量
      handleExceed(files, fileList) {
        this.$message.warning(`当前限制选择 1 个文件,请删除后继续上传`)
      },

      // 上传文件
      uploadFile(item) {
        let _this = this
        let fileObj = item.file
        const form = new FormData()// FormData 对象
        form.append('file', fileObj)// 文件对象  'upload'是后台接收的参数名
        axios({
          url: 'http://127.0.0.1:8000/file/excel_upload/',
          data: form,
          method: 'POST',
          contentType: 'multipart/form-data',
          processData: false //告诉jquery不要对form进行处理
          // contentType: false, //指定为false才能形成正确的Content-Type
        })
          .then(function(res) {
            // console.log('上传成功', res)
            // console.log("上传路径",res.data.excel_file_path)
            _this.$message.success("上传成功")
          })
          .catch(function(err) {
            let res = err.response
            // console.log('失败', res)
            _this.$message.error(res.data.msg)
          })
      },
      // 检查是否上传
      onSubumit(){
        if (this.isUpload == false){
          this.$message.error("请上传excel文件")
          return false
        } else {
          this.$message.success("文件已上传")
          return true
        }
      },
    }
  }
</script>

<style>
</style>

请自行修改路由

访问vue测试页,效果如下:

上传非excel文件,效果如下:

上传大于5M的excel文件,效果如下:

上传正确的excel文件,效果如下:

查看接口返回信息,效果如下:

查看django项目的upload目录,就可以看到上传的文件了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
vue+django实现下载文件
在实际项目,某些下载链接,是私密的。必须使用post方式,传递正确的参数,才能下载。
py3study
2021/03/04
2.1K0
vue+django实现下载文件
vue上传文件流
创建formData方法,把文件流以及所有需要上传的数据通过formData.append传入formData中,上传请求中的data中只需要放一个formData就可以了。
全栈程序员站长
2022/11/03
1.1K0
【在线教育】课程科目入门
<groupId>org.springframework.boot</groupId>
陶然同学
2023/02/27
4900
【在线教育】课程科目入门
从零搭建一个django项目-6-注册实现(上)
点击注册,控制台报错Access to XMLHttpRequest at 'http://localhost:8000/api/register/' from origin 'http://localhost:8081' has been blocked by CORS policy:
怪盗LYL
2022/06/13
4600
从零搭建一个django项目-6-注册实现(上)
tinymce图片上传
对于上传图片功能,tinymce提供了很多相关配置http://tinymce.ax-z.cn/configure/file-image-upload.php
py3study
2021/04/16
5.9K0
tinymce图片上传
iView组件+Django实现前后端分离上传图片
原生的django, 获取文件在request.data[“file”]里面,获取一个文件对象
Autooooooo
2020/11/09
1.4K0
iView组件+Django实现前后端分离上传图片
vue中上传文件_vue上传文件前端完整实例
input[type=“file”]上传文件原理详解https://blog.csdn.net/weixin_42193004/article/details/96275626
全栈程序员站长
2022/09/22
1.2K0
vue中上传文件_vue上传文件前端完整实例
el-upload 上传Demo
<el-upload class="upload-demo" ref="upload" :on-change="handleUploadChange" :on-success="handleImportSuccess" :before-upload="beforeImportUpload" :http-request="uploadZip" :file-list="fileList" :on-remove="handleUploadRemove
李维亮
2021/07/08
1.3K0
黑马瑞吉外卖之文件上传和下载
文件上传的前端页面我们使用到的是spring-web对上传代码的一个封装。 我们采用到一个上传的前端页面
兰舟千帆
2022/09/26
3880
批量上传GPT知识库,前端elementui的upload上传组件,后端Golang的上传接口实现
为了实现批量上传GPT的知识库并且功能,那么这个上传组件就必不可少,需要能把文档上传到服务器中。
唯一Chat
2023/04/21
6150
批量上传GPT知识库,前端elementui的upload上传组件,后端Golang的上传接口实现
Vue + Flask 小知识(一)
首先,我们要有一个后台接口,来获取到指定目录下的文件。例如如果我们想获取目录下的 xlsx 文件,那么可以编写代码如下:
周萝卜
2019/07/17
1.1K0
Vue + Flask 小知识(一)
使用ElementUI el-upload一次性上传多个文件
在日常的前端开发中,文件上传是一个非常常见的需求,尤其是在用户需要一次性上传多个文件的场景下。ElementUI作为一款非常优秀的Vue.js 2.0组件库,为我们提供了丰富的UI组件,极大地提升了开发效率。其中,el-upload组件便是一个功能强大且易于使用的文件上传组件。
繁依Fanyi
2024/07/02
3.3K0
将文件拖到此处,点击上传
<template> <div v-loading="loading"> <el-upload ref="uploadExcel" class="upload-demo" drag :http-request="uploadFile" action="action" :limit="limitNum" :show-file-list="true" accept=".xlsx,.xls" :
达达前端
2020/11/12
1.3K0
【解决方案】ElementUI图片上传前如何对尺寸进行验证并且上传到新浪SCS?
具体的属性可以查看官方文档,这里用到的是:before-upload="beforeAvatarUpload" 这个钩子函数,看名字就知道这是在图片上传前执行的方法,在此可以进行一些验证,官方给出了对图片类型以及大小的验证,接下来将实现对图片尺寸的验证.
一尾流莺
2022/12/10
1.2K0
【解决方案】ElementUI图片上传前如何对尺寸进行验证并且上传到新浪SCS?
大文件上传切片上传 vue java
使用vue+elementui进行前端开发, 实现在dialog中 带进度条的上传大文件页面
solate
2020/06/18
6.7K1
vue+element-ui的简洁导入导出功能【包含上传到云】
这个一般还是很常见的, 原理是将文件存储到云端,返回一个存贮地址存在本地服务器, cos存储过程:鉴权===分片上传===成功返回存储地址 tencent的cos存贮
火狼1
2019/04/17
2.6K0
ElementUI 分页+django rest framework
在之前的文章中,链接如下:https://www.cnblogs.com/xiao987334176/p/14313471.html
py3study
2021/03/29
1.7K0
ElementUI 分页+django rest framework
antdesign + koa 实现图片上传
我们今天实现一下图片上传,前端用到的是antdesign中的文件上传,后端是自己封装的node的koa框架。
用户4793865
2023/01/12
8760
vue+element-ui+xlsx实现校验前端上传的Excel文件
项目中需要校验上传的Excel模板是否符合规范。一开始的想法是在后端进行校验,但是后来想到一个跑批的文件最大是2M,如果放置在后端校验,对于不规范的文件,这2M的传输也就白费了,同时,对于用户的体验也很不好,就想把校验放置在客户端,不合乎规范的文件直接拒掉,节省带宽同时客户体验也有所改善。
RedSheep
2019/09/19
5K0
vue+element-ui+xlsx实现校验前端上传的Excel文件
el-upload上传文件和表单一起提交+后端接收代码
一、前言 我们在做前端时,会遇到这样的需求,上传Excel文件,并且还要和填写的表单数据,一起发送.我们知道el-upload默认的是选中文件后直接请求到后端的接口.现在就需要我们修改这种默认的上传形式,和填写完的form表单一起请求后端接口. 二、前端页面展示 三、表单代码 <el-dialog title="导入源数据库表单信息" :visible.sync="dialogVisible1"> <el-form ref="importFormRef" :model="import
掉发的小王
2022/07/11
2.5K0
el-upload上传文件和表单一起提交+后端接收代码
推荐阅读
相关推荐
vue+django实现下载文件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文