netcore3.1 + vue (前后端分离) ElementUI多文件带参数上传
vue前端代码
前端主要使用了ElementUI的el-uploda插件,除去业务代码需要注意的是使用formdata存储片上传时所需的参数
<el-upload
class="upload-demo"
multiple
ref="upload"
action="#"
accept=".jpg,.tif"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-upload="handleBefore"
:http-request="handleHttpRequest"
:on-change="handleChange"
:file-list="fileList"
:auto-upload="false">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<el-button
style="margin-left: 10px; margin-right: 20px"
size="small"
type="success"
@click="handleUpload">上传到服务器</el-button>
</el-upload> data(){
fileList: [], // 上传文件列表
} methods:{
//上传前回调
handleBefore: function (file) {
// this.picData={
// name:file.name,
// picType:0
// }
},
// 覆盖默认的上传行为,可以自定义上传的实现
handleHttpRequest: function (para) {},
// 文件列表移除文件时的钩子
handleRemove: function (file, fileList) {
// console.log(file, fileList);
},
handleChange(file, fileList) {
this.fileList = fileList;
},
//上传到服务器
handleUpload() {
if (this.selectPicType !== null && this.fileList.length>0) {
let _this = this;
//使用formdata添加上传时所带参数
let formData = new FormData();
let data = [];
let imageType = true;
let selectDocument = this.selectDocumentType=="第一部分" ? 0 : this.selectDocumentType=="第二部分" ? 1 : this.selectDocumentType=="第三部分" ? 2 : "";
if(this.selectPicType == 2 && this.selectDocumentType=='') {
this.$message({
type:'error',
message: '请选择目录!'
})
return;
}
this.fileList.forEach((item) => {
var imgName = new RegExp(/^\d+\.(jpg|tif)$/);
if(!(imgName.test(item.name))) {
imageType = false;
}
formData.append("files", item.raw);
data.push({
VId: this.fuId, //退役军人个人信息id
DId: this.currenttMaterialId, //目录材料id
ServerPathId: 1,
BackUpPathId: 1,
PicName: item.name,
picType: this.selectPicType, //上传类型
TextType: selectDocument, //正文中的目录
ReelNumber: this.fuReelNumber, //上传卷号
VName: this.fuVName, //退役军人姓名
ArchivesYear: this.fuarchivesYear //年度
});
});
if(imageType == false) {
this.$message({
type: 'error',
message: '请选择名称为数字的文件,并且是jpg和tif格式'
})
this.fileList = [];
return;
} else if (imageType == true) {
formData.append("params",JSON.stringify( data));
multiFileUpload(formData).then((res) => {
this.getCurrentList();
this.$message({
type:"success",
message: "上传成功"
})
this.catalog = false;
this.inputShow = false;
this.fileList = [];
this.selectPicType = null;
this.selectDocumentType = '';
selectDocument = '';
this.currenttMaterialId = null;
});
} } else {
this.$message({
type:"error",
message: "选择文件和要上传图片的类型!"
})
} },
// 点击文件列表中已上传的文件时的钩子
handlePreview: function (file) {
// console.log(file);
}
}
后端代码
后台使用Request.Form来接收参数,把图片上传的信息存到出数据库
/// <summary>
/// 多文件上传
/// </summary>
/// <param name="formCollection">表单集合值</param>
/// <returns>服务器存储的文件信息</returns> [HttpPost]
public JsonResult MultiFileUpload(IFormCollection formCollection)
{
var currentDate = DateTime.Now;
//var webRootPath = _hostingEnvironment.WebRootPath;//>>>相当于HttpContext.Current.Server.MapPath("")
//var webRootPath = _hostingEnvironment.ContentRootPath;//>>>相当于HttpContext.Current.Server.MapPath("")
var uploadFileRequestList = new List<UploadFileRequest>();
var jsondata = Request.Form["params"];
//var UploadPicDTOs = (List<UploadPicDTO>)JsonConvert.DeserializeObject(jsondata,typeof( List< UploadPicDTO >));
var UploadPicDTOs = JsonConvert.DeserializeObject<List<UploadPicDTO>>(jsondata);
var insertPicData = new List<TBase_ImgDetailInfo>(); try
{
//FormCollection转化为FormFileCollection
var files = (FormFileCollection)formCollection.Files; if (files.Any())
{
foreach (var file in files)
{
string filePath = string.Empty;
var uploadFileRequest = new UploadFileRequest();
var picData = UploadPicDTOs.FirstOrDefault(s => s.PicName == file.FileName);
var webRootPath = _tImgServerPathService.QueryById(picData.ServerPathId).Result.ServerPath; if (picData.PicType == 0 || picData.PicType == 1 || picData.PicType == 3)
filePath = $"\\{picData.ArchivesYear}\\{picData.ReelNumber}-{picData.VName}\\";
else
filePath = $"\\{picData.ArchivesYear}\\{picData.ReelNumber}-{picData.VName}\\{picData.TextType + 1}\\"; //创建每日存储文件夹
if (!Directory.Exists(webRootPath + filePath))
{
Directory.CreateDirectory(webRootPath + filePath);
} //文件后缀
var fileExtension = Path.GetExtension(file.FileName);//获取文件格式,拓展名 //判断文件大小
var fileSize = file.Length; if (fileSize > 1024 * 1024 * 10) //10M TODO:(1mb=1024X1024b)
{
continue;
} //保存的文件名称(以名称和保存时间命名)
var saveName = file.FileName.Substring(0, file.FileName.LastIndexOf('.')) + "_" + currentDate.ToString("yyyyMMddHHmmss") + fileExtension;
string fullPath = webRootPath + filePath + saveName; //文件保存
using (var fs = System.IO.File.Create(fullPath))
{
file.CopyTo(fs);
fs.Flush();
} //完整的文件路径
var completeFilePath = Path.Combine(filePath, saveName); uploadFileRequestList.Add(new UploadFileRequest()
{
FileName = saveName,
FilePath = completeFilePath
});
insertPicData.Add(new TBase_ImgDetailInfo()
{
VId = picData.VId,
DId = picData.DId,
ServerPathId = picData.ServerPathId,
BackUpPathId = picData.BackUpPathId,
PicName = picData.PicName,
PicRealName=saveName,
RelativePath = filePath,
//FullPath= fullPath,
PicType = picData.PicType,
TextType = picData.TextType,
ArchivesYear = picData.ArchivesYear,
PicPageNo= int.Parse(file.FileName.Substring(0, file.FileName.LastIndexOf('.'))),
CreateId = _user.ID,
CreateBy = _user.Name
});
}
}
else
{
return new JsonResult(new { isSuccess = false, resultMsg = "上传失败,未检测上传的文件信息~" });
}
}
catch (Exception ex)
{
return new JsonResult(new { isSuccess = false, resultMsg = "文件保存失败,异常信息为:" + ex.Message });
} if (uploadFileRequestList.Any())
{
_tImgDetailInfoService.Add(insertPicData);
return new JsonResult(new { isSuccess = true, returnMsg = "上传成功", filePathArray = uploadFileRequestList });
}
else
{
return new JsonResult(new { isSuccess = false, resultMsg = "网络打瞌睡了,文件保存失败" });
}
} /// <summary>
/// 对文件上传响应模型
/// </summary>
public class UploadFileRequest
{
/// <summary>
/// 文件名称
/// </summary>
public string FileName { get; set; } /// <summary>
/// 文件路径
/// </summary>
public string FilePath { get; set; }
}
netcore3.1 + vue (前后端分离) ElementUI多文件带参数上传的更多相关文章
- netcore3.1 + vue (前后端分离)Excel导入
1.前端(vue)代码 2.公共类ExcelHelper 3.后端(netcore)代码 思路:导入类似于上传,将excel上传后将流转换为数据 1.前端(Vue)代码 这里使用的是ElementUI ...
- netcore3.1 + vue (前后端分离) IIS 部署
1.安装 aspnetcore-runtime-3.1.1-win-x64.exe 2.安装dotnet-hosting-3.1.1-win.exe 3.安装urlrewrite和applicatio ...
- netcore3.1 + vue (前后端分离)生成PDF(多pdf合并)返回前端打印
1.使用Adobe Acrobat XI Pro编辑pdf模板 2.公共类代码 3.service层调用 4.Controller层 5.前端(Vue) 因为print.js不支持宋体,所以打算用后台 ...
- SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题
原文链接:https://segmentfault.com/a/1190000012879279 当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异.笔者前几天刚好在负责一个项目的权限管理 ...
- 解决Django+Vue前后端分离的跨域问题及关闭csrf验证
前后端分离难免要接触到跨域问题,跨域的相关知识请参:跨域问题,解决之道 在Django和Vue前后端分离的时候也会遇到跨域的问题,因为刚刚接触Django还不太了解,今天花了好长的时间,查阅了 ...
- Flask + vue 前后端分离的 二手书App
一个Flask + vue 前后端分离的 二手书App 效果展示: https://blog.csdn.net/qq_42239520/article/details/88534955 所用技术清单 ...
- 喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了
折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...
- 两个开源的 Spring Boot + Vue 前后端分离项目
折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...
- beego-vue URL重定向(beego和vue前后端分离开发,beego承载vue前端分离页面部署)
具体过程就不说,是搞这个的自然会动,只把关键代码贴出来. beego和vue前后端分离开发,beego承载vue前端分离页面部署 // landv.cnblogs.com //没有授权转载我的内容,再 ...
随机推荐
- Docker学习(6) 获取和推送镜像
查找镜像 拉取镜像 推送镜像 总结
- GO语言练习---对切片进行排序
对整型切片进行选择排序 package main import "fmt" /*对切片排序*/ func SortSlice(slice []int) { for i := 0; ...
- 4D毫米波雷达Radar
4D毫米波雷达Radar 围绕雷达.激光雷达.高精定位等新一代传感器技术将会进入量产周期. 自动驾驶公司的竞争,在传感器配置上坦白说并没有太多差异化.除了车载激光雷达属于近几年的产物,类似摄像头.毫米 ...
- 人脸真伪验证与识别:ICCV2019论文解析
人脸真伪验证与识别:ICCV2019论文解析 Face Forensics++: Learning to Detect Manipulated Facial Images 论文链接: http://o ...
- TensorFlow六种激活函数
TensorFlow六种激活函数 每个神经元都必须有激活函数.神经元提供了模拟复杂非线性数据集所必需的非线性特性.该函数取所有输入的加权和,进而生成一个输出信号.把它看作输入和输出之间的转换.使用适当 ...
- P1831 杠杆数(数位Dp)
题目描述 如果把一个数的某一位当成支点,且左边的数字到这个点的力矩和等于右边的数字到这个点的力矩和,那么这个数就可以被叫成杠杆数. 比如$4139$就是杠杆数,把3当成支点,我们有这样的等式:$4 \ ...
- selenium css定位元素
CSS 选择器: 常见符号: #表示 id选择器 .表示 class选择器 >表示子元素,层级 一个空格也表示子元素,但是是所有的后代子元素,相当于 xpath 中的相对路径 一.css:属性定 ...
- python django框架+vue.js前后端分离
本文用于学习django+vue.js实现web前后端分离协作开发.以一个添加和删除数据库书籍应用为实例. django框架官方地址:https://www.djangoproject.com/ vu ...
- UF_TRNS 变换相关
Open C uf5940uf5941uf5942 矩阵乘积变换uf5943 平移变换uf5944 缩放变换uf5945 旋转变换uf5946 镜像变换uf5947 实现变换,根据变换矩阵 ...
- 类编程的WAF(下)
一.编程语言的要素 天存信息的iWall3应用防火墙是一种创新式的类编程 WAF,它包含了编程语言的一些基本要素. 1. 变量 iWall3 中广义的变量包括报文变量.环境变量和用户变量:报文变量和环 ...