ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件

摘要:
在之前的开发中,元素ui上传组件el上传被直接用于选择并在文件被选择后立即上传文件。上传成功后,需要清除文件列表中的文件列表数据。

前言:

  从开始学习Vue到使用element-ui-admin已经有将近快两年的时间了,在之前的开发中使用element-ui上传组件el-upload都是直接使用文件选取后立即选择上传,今天刚好做了一个和之前类似的文件选择上传的需求,不过这次是需要手动点击按钮把文件上传到服务器中进行数据导入,而且最多只能够选择一个文件进行上传,上传成功后需要对file-list中的文件列表数据进行清空操作,在这里服务端使用的是ASP.NET Core WEB API来进行文件流数据接收和保存。

一、简单概述el-upload文件上传组件:

el-upload组件详情,查看官方解释:

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

常用的基本属性:

参数说明类型可选值默认值
action必选参数,上传的地址string
headers设置上传的请求头部object
multiple是否支持多选文件boolean
data上传时附带的额外参数object
name上传的文件字段名stringfile
with-credentials支持发送 cookie 凭证信息booleanfalse
show-file-list是否显示已上传文件列表booleantrue
drag是否启用拖拽上传booleanfalse
accept接受上传的文件类型(thumbnail-mode 模式下此参数无效)string
on-preview点击文件列表中已上传的文件时的钩子function(file)
on-remove文件列表移除文件时的钩子function(file, fileList)
on-success文件上传成功时的钩子function(response, file, fileList)
on-error文件上传失败时的钩子function(err, file, fileList)
on-progress文件上传时的钩子function(event, file, fileList)
on-change文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用function(file, fileList)
before-upload上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。function(file)
before-remove删除文件之前的钩子,参数为上传的文件和文件列表,若返回 false 或者返回 Promise 且被 reject,则停止删除。function(file, fileList)
list-type文件列表的类型stringtext/picture/picture-cardtext
auto-upload是否在选取文件后立即进行上传booleantrue
file-list上传的文件列表, 例如: [{name: 'food.jpg', url: 'https://xxx.cdn.com/xxx.jpg'}]array[]
http-request覆盖默认的上传行为,可以自定义上传的实现function
disabled是否禁用booleanfalse
limit最大允许上传个数number

二、需要实现的效果:

  通过单击文件上传按钮,能够弹窗一个Dialog文件选择框,通过点击选取文件按钮选择需要导入的Excel文件,然后手动点击数据导入按钮将Excel文件流通过Post请求传输到ASP.NET Core后台服务中,并进行数据保存操作。

弹出框效果如下图所示:

ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件第1张

 三、代码实现:

前端Vue代码实现:

注意,清空已上传的文件列表:

需要ref="upload"和file-list="fileList"这两个属性同时存在,否则即使调用this.$refs.upload.clearFiles();该方法也无效

Template代码:

<template>
  <div>
     <el-dialog title="数据导入" :visible.sync="dialogVisible" width="30%" :before-close="handleClose">
      <el-upload
        class="upload-demo"
        ref="upload"
        :action="actionRequestUrl"
        :on-preview="handlePreview"
        :on-remove="handleRemove"
        :on-success="fileUploadSuccess"
        :on-error="fileUploadFail"
        :on-change="fileChange"
        :file-list="fileList"
        :limit="1"
        :auto-upload="false"
        :headers="headers">
        <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
        <el-button size="small" @click="downloadTemplate">导入模板下载</el-button>
        <div slot="tip" class="el-upload__tip">请按照导入模板中的数据格式导入</div>
      </el-upload>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <!-- <el-button type="primary" @click="dialogVisible = false">确 定</el-button> -->
        <el-button style="margin-left: 10px;" type="success" @click="submitUpload">数据导入</el-button>
        <!-- <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> -->
      </span>
    </el-dialog>
  </div>
</template>

Js中代码:

<script>
 data() {
    return {
      fileList: [], //文件列表
      dialogVisible: false,//Dialog显示状态
      headers: { "X-Token": jwtToken }//设置上传的请求头部
      fileDownloadUrl:'www.xxxx.com',//文件下载地址
      actionRequestUrl:'www.xxxx.com/fileUpload'//请求服务器接口地址
      }},
     //执行相关的方法
     methods: {
     //打开导入弹窗
    openImporDialog() {
      this.dialogVisible = true;
    },
    //关闭弹窗
    handleClose() {
      this.dialogVisible = false;
    },
    //上传到服务器
    submitUpload() {
      console.log(this.fileList);
      if (this.fileList.length <= 0) {
        this.$message.error("请先选择需要上传的文件!");
        return false;
      }
      this.$refs.upload.submit();
    },
    //文件上传服务端失败时的钩子
    fileUploadFail: function(err, file, fileList) {
      console.log("文件上传失败", file, fileList);
    },
    //文件上传服务端成功时的钩子
    fileUploadSuccess: function(response, file, fileList) {
      console.log("上传成功");
      console.log(response);
      //清空已上传的文件列表
      this.$refs.upload.clearFiles();
      if (response.result) {
        this.dialogVisible = false;
        this.$message({
          message: response.message,
          type: "success"
        });
      } else {
        this.$message.error(response.message);
      }
    },
    //文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
    fileChange(file, fileList) {
      //解决无法判断el-upload是否上传过文件问题
      this.fileList = fileList;
      console.log("选择文件上传成功后显示的内容》", file, fileList);
    },
    //文件列表移除文件时的钩子
    handleRemove(file, fileList) {
      this.fileList = [];
      // return this.$confirm(`确定移除 ${file.name}?`);
    },
    //点击文件列表中已上传的文件时的钩子
    handlePreview(file) {
      console.log(file);
    },
    //导入模板下载
    downloadTemplate() {
      window.location.href =this.fileDownloadUrl+"/xxxExcel导入模板.xlsx";
    }
    }
</script>

服务端ASP.NET Core WEB API来进行文件流数据接收和保存:  

ASP.NET Core单文件和多文件上传并保存到服务端详情概述:

https://www.cnblogs.com/Can-daydayup/p/12637100.html

using System;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace FileUploadManage.Controllers
{
    /// <summary>
    /// 图片,视频,音频,文档等相关文件通用上传服务类
    /// </summary>
    public class FileUploadController : Controller
    {
        private static IHostingEnvironment _hostingEnvironment;

        public FileUploadController(IHostingEnvironment hostingEnvironment)
        {
            _hostingEnvironment = hostingEnvironment;
        }

        /// <summary>
        /// Form表单之单文件上传
        /// </summary>
        /// <param name="formFile">form表单文件流信息</param>
        /// <returns></returns>
        public JsonResult FormSingleFileUpload(IFormFile formFile)
        {
            var currentDate = DateTime.Now;
            var webRootPath = _hostingEnvironment.WebRootPath;//>>>相当于HttpContext.Current.Server.MapPath("") 

            try
            {
                var filePath = $"/UploadFile/{currentDate:yyyyMMdd}/";

                //创建每日存储文件夹
                if (!Directory.Exists(webRootPath + filePath))
                {
                    Directory.CreateDirectory(webRootPath + filePath);
                }

                if (formFile != null)
                {
                    //文件后缀
                    var fileExtension = Path.GetExtension(formFile.FileName);//获取文件格式,拓展名

                    //判断文件大小
                    var fileSize = formFile.Length;

                    if (fileSize > 1024 * 1024 * 10) //10M TODO:(1mb=1024X1024b)
                    {
                        return new JsonResult(new { isSuccess = false, resultMsg = "上传的文件不能大于10M" });
                    }

                    //保存的文件名称(以名称和保存时间命名)
                    var saveName = formFile.FileName.Substring(0, formFile.FileName.LastIndexOf('.')) + "_" + currentDate.ToString("HHmmss") + fileExtension;

                    //文件保存
                    using (var fs = System.IO.File.Create(webRootPath + filePath + saveName))
                    {
                        formFile.CopyTo(fs);
                        fs.Flush();
                    }

                    //完整的文件路径
                    var completeFilePath = Path.Combine(filePath, saveName);

                    return new JsonResult(new { isSuccess = true, returnMsg = "上传成功", completeFilePath = completeFilePath });
                }
                else
                {
                    return new JsonResult(new { isSuccess = false, resultMsg = "上传失败,未检测上传的文件信息~" });
                }

            }
            catch (Exception ex)
            {
                return new JsonResult(new { isSuccess = false, resultMsg = "文件保存失败,异常信息为:" + ex.Message });
            }

        }
    }
}

免责声明:文章转载自《ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇用Python做股市数据分析(二)androidstudio安卓获取外部sd卡存储下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

win7 64位 安装 VS2010 SP1 失败的解决方法

1. 系统环境:Windows Server 2008 R2(与Win7 x64系统相似),VS2010及常用办公、编程工具等软件2. 问题症状:无论是通过在线安装包还是ISO安装包安装,多次安装,都在安装过程中回滚,最终安装失败。3. 产生原因:系统安装整一年,常年使用,系统自动补丁等操作,使得原系统盘C盘40G空间告急,于是动手删除了部分C:Windo...

Delphi通用的序列化代码

type TFoo = class public function Object2Json<T>(o: T): string; function Json2Object<T>(j: string): T; end; implementation function TFoo.Json2Object&...

用jq中jSignature做手动签名

<!DOCTYPE html><html lang="zh-CN"><head> <title>手写板签名demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <...

Flowable源码分析:Spring Data JPA实现从自己创建的数据库中读取指定信息

在Flowable-ui-task模块查询数据库相关内容记录 目录: 读取信息为Flowable内部对象 读取信息为自定义对象属性 读取信息为ProcessDefinition(Flowable内部对象) ProcessDefinition为Flowable中定义的对象,因此有提供专门的数据库查询接口,如: 以id的方式 repositorySer...

jpgraph 折线图--解决中文乱码的问题(标题和图例)

在jpgraph根目录中: 如Jpgjpgraph_ttf.inc.php 中开头添加 define('CHINESE_TTF_FONT','SIMYOU.TTF'); Jpgjpgraph_legend.inc.php 中大约24行添加 修改 public $font_family=FF_CHINESE,$font_style=FS_NORMAL,$fo...

用configmap管理配置

一、ConfigMap介绍管理配置: ConfigMap介绍 Secret 可以为 Pod 提供密码、Token、私钥等敏感数据;对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap ConfigMap 的创建和使用方式与 Secret 非常类似,主要的不同是数据以明文的形式存放。 与 Secret 一样,ConfigMap 也支持四种创...