C# MVC 多图片上传预览

一.效果图:

在这里插入图片描述
开发框架:MVC,Layui
列表主界面这里就不展示了,可以去看看这篇文章:Layui项目实战,这里讲的是“上传Banner”界面功能:
其中包括,多文件上传,预览,后台接收,保存,仅此而已

二.项目代码:

1.前端Html代码

head头部代码块:
注意:这里引用的是Layui和jQuery插件,不过重点功能还是在jQuery,Layui只是起到样式效果

<head><meta name="viewport" content="width=device-width" /><title>PushCircleBanner</title><link href="~/Scripts/layui/css/layui.css" rel="stylesheet" /><script src="~/Scripts/jquery-3.3.1.js"></script><script src="~/Scripts/layui/layui.js"></script><style>* {margin: 0;padding: 0;}.box {width: 80%;height: 80vh;margin: auto;}.box p {height: 30px;margin: 10px;}#file{display:none;}.ImgsBox img{width:100px;height:100px;}.select,input{width:200px;}</style>
</head>

body代码块:
注意:这里既然是文件上传,重点自然是input[“file”],multiple=“multiple"多文件上传,accept=”.png,.jpg,.jpeg,.bmp,.gif,.jfif,.ico "限制允许选择的文件类型

<div class="box"><p>性别:</p><p class="layui-input-inline"><select name="sex" class="sex layui-input select"><option value="0" selected>全部</option><option value="1">男</option><option value="2">女</option></select></p><p>是否去重:</p><p class="layui-input-inline"><select name="isDistinct" class="isDistinct layui-input select"><option value="0" selected>否</option><option value="1">是</option></select></p><p>图片上传:</p><p><input type="button" class="layui-btn" name="name" onclick="$('#file').click()" value="上传" /><input id="file" type="file" multiple="multiple" name="img" value="上传" accept=".png,.jpg,.jpeg,.bmp,.gif,.jfif,.ico " onchange="PushFiles()" /></p><p><input type="button" class="layui-btn submit" onclick="Save()" value="保存" /></p><div class="ImgsBox"></div></div>

Js代码块:

注意:PushFiles方法,由点击显示的上传按钮,再触发隐藏的input[“file”]按钮的点击方法,改变files值后触发该方法,实现多文件上传效果,也是这里前端界面展示的重点

<script>var files;function PushFiles() {$('.ImgsBox').html('');files = document.getElementById('file').files;if (files && files.length > 0) {for (var i = 0; i < files.length; i++) {var file = files[i];var URL = window.URL || window.webkitURL;var imgURL = URL.createObjectURL(file);console.log(imgURL);var img = $('<img src="" />');img.attr('src', imgURL);$('.ImgsBox').append(img);}}}

注意:Save方法,由点击保存按钮触发,js的FormData对象进行表单参数收集,ajax再通过文件传输的方式,提交到后台

        function Save() {if (files && files.length > 0) {var formData = new FormData();formData.append('sex', $('.sex').val());formData.append('isDistinct', $('.isDistinct').val());for (var i = 0; i < files.length; i++) {formData.append('img_'+i,files[i] );}$.ajax({url: '/Circle/PushBanner',data: formData,type: 'POST',cache: false,//这个参数是jquery特有的,不进行序列化,因为我们不是json格式的字符串,而是要传文件processData: false, //注意这里一定要设置contentType:false,不然会默认为传的是字符串,这样文件就传不过去了contentType: false,//dataType: "json",success: function (res) {if (res.code == 0) {var index = parent.layer.getFrameIndex(window.name);//先得到当前iframe层的索引   parent.layer.close(index);//再执行关闭} else {alert(res.msg);}}})} else {alert("请选择上传文件!");}}</script>

2.后台C#代码

注意:下面的后台代码块,只要把间隔的注意提示去掉,就能拼接出完整的后台代码

	/// <summary>/// 图片批量上传/// </summary>/// <returns></returns>public ActionResult PushBanner(){

后台登录校验

        if (!(Session["account"] is AccountModel account))return Json(new { code = -1, msg = "登录异常" }, JsonRequestBehavior.AllowGet);

获取前端传输参数:

        StringBuilder msg = new StringBuilder();int error = 0;AliyunOssProvider aliyunOss = new AliyunOssProvider();string suffix = string.Empty;var files = Request.Files;	//ajax传输文件var sex = Request.Form["sex"] == null ? 0 : int.Parse(Request.Form["sex"]);var isDistinct = Request.Form["isDistinct"] == null ? 0 : int.Parse(Request.Form["isDistinct"]);

多文件循环保存:

        for (int i = 0; i < files.Count; i++){var type = files[i].ContentType;if (type.Contains("image")){switch (type){case "image/jpeg":suffix = ".jpg";break;case "image/png":suffix = ".png";break;case "image/bmp":suffix = ".bmp";break;case "image/gif":suffix = ".gif";break;case "image/pipeg":suffix = ".jfif";break;case "image/x-icon":suffix = ".ico";break;default:error++;var obj = new {code = -1,msg = "检测到非指定文件格式(jpg/png/bmp/gif/ico/jfif)"};msg.AppendLine(JsonHelper.SerializeObject(obj));continue;//return Json(new { result = false, messge = "请将图片转化为(jpg/png/bmp/gif/ico/jfif)格式然后上传!" });}if (string.IsNullOrWhiteSpace(suffix)){error++;var obj = new{code = -1,msg = "检测到非指定文件格式(jpg/png/bmp/gif/ico/jfif)"};msg.AppendLine(JsonHelper.SerializeObject(obj));continue;}var file = "banner/";var fileName = DateTime.Now.ToStampDateTime() + "_"+i + suffix;

阿里云图床文件存储,底层不予展示:

                try{var absoluteUri = aliyunOss.UploadObject(files[i].InputStream, file + fileName);}catch (Exception e){error++;var obj = new { code = -2, message = "文件上传失败" };msg.AppendLine(JsonHelper.SerializeObject(obj));//return Json(new { result = false, message = "上传失败" });}

Banner信息存数据库:(底层是数据库保存语句)

                var res = new CircleBll().AddCircleBanners(new Model.CircleBanner() {ImgUrl = AppConfig.AliyunUrl + file + fileName,Sex = sex.ToString(),IsDistinct = isDistinct.ToString(),OperatorId = account.UserId.ToString()});if (!res){error++;var obj = new { code = -3, message = "圈子Banner数据库存储失败" };}}}return error == 0 ? Json(new { code = 0, msg = "",data = true }): Json(new { code = error * -1,msg = msg.ToString(),data = false });}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue进阶-消息的订阅与发布

&#x1f4d6;vue基础学习-组件 介绍了嵌套组件间父子组件通过 props 属性进行传参。子组件传递数据给父组件通过 $emit() 返回自定义事件&#xff0c;父组件调用自定义事件接收子组件返回参数。 &#x1f4d6;vue进阶-vue-route 介绍了路由组件传参&#xff0c;两种方式&…

【conan】本地编译三方库,上传conan服务器

1.6 conan 远程已经编译好的库 conan中文博客&#xff1a; 三方库资源&#xff1a; github conan-io 本地查询 conan search Existing package recipes:b2/4.9.6 boost/1.71.0nolovr/stable bzip2/1.0.8 ceres-solver/2.0.0nolovr/stable eigen/3.3.7nolovr/stable eigen_c…

【软件测试】selenium中元素的定位

1.元素的定位 不管用那种方式&#xff0c;必须保证页面上该属性的唯一性 1.CSS 定位 CSS(Cascading Style Sheets)是一种语言&#xff0c;它被用来描述HTML 和XML 文档的表现。 CSS 使用选择器来为页面元素绑定属性。这些选择器可以被selenium 用作另外的定位策略CSS的获取可…

C++基础算法前缀和和差分篇

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C算法 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要讲解了前缀和和差分算法 文章目录 Ⅳ. 前缀和 和 差分Ⅵ .Ⅰ前缀和…

echarts_柱状图+漏斗图

目录 柱状图(bar)需求[1] 复制案例[2] 修改类目轴方向[3] 修改数据渲染方向[4] 修改坐标轴文本样式 漏斗图(funnel)漏斗图的形状 柱状图(bar) 需求 如上图&#xff0c;做一个横向柱状图&#xff0c;后端返回的数据是从小向大排列的数据&#xff0c;希望能够按照顺序进行展示。…

【Docker】详解docker安装及使用

详解docker安装及使用 1. 安装docker1.1 查看docker版本信息 2. Docker镜像操作3. Docker容器操作4.知识点总结4.1 docker镜像操作4.2 docker容器操作4.3 docker run启动过程 参见docker基础知识点详解 1. 安装docker 目前Docker只能支持64位系统。 ###关闭和禁止防火墙开机自…

pytorch+CRNN实现

最近接触了一个仪表盘识别的项目&#xff0c;简单调研以后发现可以用CRNN来做。但是手边缺少仪表盘数据集&#xff0c;就先用ICDAR2013试了一下。 结果遇到了一系列坑。为了不使读者和自己在以后的日子继续遭罪。我把正确的代码发到下面了。 1&#xff09;超参数请不要调整&am…

Android oom_adj 详细解读

源码基于&#xff1a;Android R 0. 前言 在博文《oom_adj 内存水位算法剖析》一文中详细的分析了lmkd 中针对 oom_adj 内存水位的计算、使用方法&#xff0c;在博文《oom_adj 更新原理(1)》、《oom_adj 更新原理(2)》中对Android 系统中 oom_adj 的更新原理进行了详细的剖析。…

Centos 7 安装 Oracle 11G

Oracle 11G 安装教程 准备环境 p13390677_112040_Linux-x86-64_1of7.zipp13390677_112040_Linux-x86-64_2of7.zipCentos 7- rhel7-英文版的系统–不想换语言的执行(LANGen_US)– 传输 文件到服务器上 创建用户和组 [rootlocalhost ~]# groupadd oracle [rootlocalhost ~]…

Windows11 C盘瘦身

1.符号链接 将大文件夹移动到其他盘&#xff0c;创建成符号链接 2.修改Android Studio路径设置 1.SDK路径 2.Gradle路径 3.模拟器路径 设置环境变量 ANDROID_SDK_HOME

基于单片机的盲人导航智能拐杖老人防丢防摔倒发短息定位

功能介绍 以STM32单片机作为主控系统&#xff1b; OLED液晶当前实时距离&#xff0c;安全距离&#xff0c;当前经纬度信息&#xff1b;超声波检测小于设置的安全距离&#xff0c;蜂鸣器报警提示&#xff1a;低于安全距离&#xff01;超声波检测当前障碍物距离&#xff0c;GPS进…

python发送邮件yagmail库

yagmail库发送邮件简洁&#xff0c;代码量少 import yagmaildef send_yagmail(sender, send_password, addressee, hostsmtp.qq.com, port465):yag yagmail.SMTP(sender, send_password, host, port)img_url https://img2.baidu.com/it/u483398814,2966849709&fm253&…

基于单片机的智能空调系统的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;LCD1602液晶显示当前水温&#xff0c;定时提醒&#xff0c;水量变化DS18B20检测当前水体温度&#xff1b;水位传感器检测当前水位&#xff1b;继电器驱动加热片进行水温加热&#xff1b;定时提醒喝水&#xff0c;蜂鸣器报警&#x…

LeetCode面试题02.07.链表相交

面试题02.07.链表相交 两种解题思路 面试题02.07.链表相交一、双指针二、哈希集合 一、双指针 这道题简单来说&#xff0c;就是求两个链表交点节点的指针 这里注意&#xff1a;交点不是数值相等&#xff0c;而是指针相等 为了方便举例&#xff0c;假设节点元素数值相等&…

用Python采用Modbus-Tcp的方式读取485电子水尺数据

README.TXT 2023/6/15 V1.0 实现了单个点位数据通信、数据解析、数据存储 2023/6/17 V2.0 实现了多个点位数据通信、数据解析、数据存储 2023/6/19 V2.1 完善log存储&#xff0c;仅保留近3天的log记录&#xff0c;避免不必要的存储&#xff1b;限制log大小&#xff0c;2MB。架…

数字原生时代,奥哲如何让企业都成为“原住民”?

22年前&#xff0c;美国教育学家马克‧普伦斯基&#xff08;Marc Prensky&#xff09;出版了《数字原生与数字移民》&#xff08;Digital Natives, Digital Immigrants&#xff09;一书&#xff0c;首次提出了“数字原住民”和“数字移民”两大概念&#xff0c;用来定义跨时代的…

【数据结构】_1.集合与复杂度

目录 1. 集合框架 2. 时间复杂度 2.1 时间复杂度和空间复杂度 2.2 时间复杂度的概念 2.3 大O的渐进表示法 2.3.1 精确的时间复杂度表达式 2.3.2 大O渐进表示法的三条规则 2.3.3 时间复杂度的最好、平均与最坏情况 2.4 时间复杂度计算示例 3.空间复杂度 1. 集合框架 …

字节跳动后端面试,笔试部分

var code "7022f444-ded0-477c-9afe-26812ca8e7cb" 背景 笔者在刷B站的时候&#xff0c;看到了一个关于面试的实录&#xff0c;前半段是八股文&#xff0c;后半段是笔试部分&#xff0c;感觉笔试部分的题目还是挺有意思的&#xff0c;特此记录一下。 笔试部分 问…

【多线程例题】顺序打印abc线程

顺序打印-进阶版 方法一&#xff1a;三个线程竞争同一个锁&#xff0c;通过count判断是否打印 方法二&#xff1a;三个线程同时start&#xff0c;分别上锁&#xff0c;从a开始&#xff0c;打印后唤醒b 三个线程分别打印A&#xff0c;B&#xff0c;C 方法一&#xff1a;通过co…

JavaFX中MVC例子理解

JavaFX可以让你使用GUI组件创建桌面应用程序。一个GUI应用程序执行三个任务&#xff1a;接受用户的输入&#xff0c;处理输入&#xff0c;并显示输出。而一个GUI应用程序包含两个 类型的代码&#xff1a; 领域代码。处理特定领域的数据和遵循业务规范。交互代码。处理用户输入…