MVC保存并压缩图片【base64】(ASP.NET Web)

MVC在项目中保存图片的几种方式

1.在控制器转换IO最后保存

2.直接储存图片路径进行保存


目标功能:新增人员档案时需要对人员的照片进行保存
在这里插入图片描述
当时第一想法是用老师交的把图片传入控制器然后进行io流转换最后保存进数据库,然而我感觉这样写似乎有点复杂。

//处理图片
public ActionResult UpEeditorFile(HttpPostedFileBase upload)                                                                
{
    try
    {
        if (upload != null)
        {
            //返回后缀。GetExtension    upload.FileName获取文件的全名  判断是否为图片
            string fileExtension = Path.GetExtension(upload.FileName);
            //ToLower将字符串转换为小写形式地副本
            fileExtension = fileExtension.ToLower();
            //判断上传的附件格式 Contains筛选
            if ("(.gif)|(.jpg)|(.bmp)|(.jpeg)|(.png)".Contains(fileExtension))
            {
                //检查目录是否存在,不存在就创建文件夹Server.MapPath
                if (!Directory.Exists(Server.MapPath("~/Document/Notice/")))
                {
                    //在项目所在的位置添加它的子目录
                    Directory.CreateDirectory(Server.MapPath("~/Document/Notice/"));
                }

                //拼接文件名====当前日期+全球唯一标识符+后缀(目的是区分上传的图片)+Guid. NewGuid随机数 + 文件后缀
                string fileName = DateTime.Now.ToString("yyyy-MM-dd") + "-" + Guid.NewGuid() + fileExtension;
                //获取物理路径===也就是绝对路径
                string filePath = Server.MapPath("~/Document/Notice/") + fileName;
                //把文件保存到物理路径当中
                upload.SaveAs(filePath);

                //获取上传的临时文件表(未保存的)
                List<string> tempFile = new List<string>();
                if (Session["tempEditorFile"] != null)
                {
                    tempFile = Session["tempEditorFile"] as List<string>;
                }
                //未保存公告的临时文件
                tempFile.Add(fileName);
                //保存到session
                Session["tempEditorFile"] = tempFile;

                string url = "/Document/Notice/" + fileName;
                var CKEditorFuncNum = System.Web.HttpContext.Current.Request["CKEditorFuncNum"];
                // 上传成功后,我们还需要通过以下的一个脚本把图片返回到ckeditor第一个 tab(图像信息) 选项页
                return Content("<script>window.parent.CKEDITOR.tools.callFunction(" + CKEditorFuncNum + ", \"" + url + "\");</script>");
            }
            else
            {
                //判断后缀发现不是图片,提示用户
                return Content("<script>alert('只能上传图片', { icon: 0, title: '提示' });</script>");
            }
        }
    }
    catch (Exception)
    {
        throw;
    }
    return Content("<script>alert('上传图片失败!', { icon: 5, title: '提示' });</script>");
}

只是想简单的保存图片,能不能直接在页面处理好数据在控制器就直接保存?

当然是可以的,最近在制作H5的过程中发现图片可以转换成base64的格式进行保存,这个方法同样也可以用于解决这个需求。

通过base64 实现图片的保存

实现思路:通过js在页面将图片处理为base64格式,然后在提交至控制器保存到数据库。回填时只需要将对应的base64编码查出来就能直接回填图片。

1.将图片转成base64编码

var imgReaderI = new FileReader();
//图片显示
imgReaderI.onload = function (evt) {
    $("#Head").attr('src', evt.target.result);
}
//文件上传事件
$('#txss').on('change', function () {
    var file = document.getElementById('txss').files[0];
    imgReaderI.readAsDataURL(file);
    var size=file.size;
    imgReaderI.onloadend = function (evt) {
         //判断图片大小是否需要进行压缩
        if (size > 600) {
            dealImage(this.result, { width: 180 });
        } else {
           //$('#ryglfo [name="Head"]')是一个隐藏的input方便提交base64数据
           //this.result 就是图片的base64编码
          $('#ryglfo [name="Head"]').val(this.result);
        }
    }
});
//图片压缩转换
function dealImage(path, obj) {
    var img = new Image();
    img.src = path;
    img.onload = function () {
        var that = this;
        var w = that.width, 
        h = that.height,
        scale = w / h;
        w = obj.width || w;
        h = obj.height || (w / scale);
        var quality = 0.85; //压缩质量 1是不压缩
        var canvas = document.createElement('canvas');
        var ctx = canvas.getContext('2d');
        var anw = document.createAttribute("width");
        anw.nodeValue = w;
        var anh = document.createAttribute("height");
        anh.nodeValue = h;
        canvas.setAttributeNode(anw); 
        canvas.setAttributeNode(anh);
        ctx.drawImage(that, 0, 0, w, h);
        if (obj.quality && obj.quality <= 1 && obj.quality > 0) {
            quality = obj.quality;
        }
        var base64 = canvas.toDataURL('image/jpeg', quality);
        //最后返回压缩后的base64编码
        $('#ryglfo [name="Head"]').val(base64)
    }
}

base64编码
在这里插入图片描述
img标签的路径可以直接用base64编码显示图片
在这里插入图片描述在这里插入图片描述
数据提交到控制器代码
这里使用的是ajax提交,用jgetjson提交会存在大小限制的问题

  $("#ryglfo").ajaxSubmit(function (msg) {});

保存到数据库的数据
这里直接当做字符串对图片的base64编码进行存储
在这里插入图片描述
图片的显示
图片要显示时直接将查询到的base64编码作为图片路径即可

  $("#Head").attr("src", data.Head);

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ASP.NET Web是一种广泛用于开发Web应用程序的框架,它提供了一套丰富的工具和功能,让开发人员可以快速构建功能强大的Web应用程序。学习ASP.NET Web的路线可以分为以下几个阶段: 1. HTML和CSS基础:ASP.NET Web开发要求对HTML和CSS有一定的了解,因为这是Web页面的基础。学习HTML和CSS可以通过在线教程或书籍来进行,建议结合实践进行学习,掌握基本的页面布局和样式设计。 2. C#编程语言:ASP.NET Web使用C#作为主要的编程语言,掌握C#语法和面向对象编程的基本概念对于学习ASP.NET Web非常重要。可以通过学习C#教程和参考书籍来学习C#编程语言。 3. ASP.NET Web Forms:ASP.NET Web Forms是使用ASP.NET Web开发的一种方式,它基于事件驱动模型,提供了一系列的Web控件和服务器端事件处理机制。学习ASP.NET Web Forms可以通过官方文档和在线教程来进行,掌握页面生命周期、控件使用和事件处理是学习的重点。 4. ASP.NET MVCASP.NET MVC是使用ASP.NET Web开发的另一种方式,它基于模型-视图-控制器的设计模式,提供了更加灵活和可测试的开发方式。学习ASP.NET MVC需要理解MVC的基本概念和使用方法,可以通过参考官方文档和实践项目来进行学习。 5. 数据库和数据访问:在Web应用程序开发中,经常需要和数据库进行数据交互。学习ASP.NET Web的路线中,了解数据库基本知识和ASP.NET提供的数据访问技术是必要的。可以学习SQL语言和ADO.NET技术来实现数据库操作。 6. 安全和性能优化:学习ASP.NET Web还需要了解如何保证应用程序的安全性和性能优化。可以学习ASP.NET提供的身份验证和授权机制,了解常见的Web安全漏洞和预防措施。同时,学习ASP.NET提供的性能优化技巧,使应用程序在访问量较大时可以保持较好的性能。 总之,学习ASP.NET Web需要逐步掌握HTML和CSS、C#编程、ASP.NET Web Forms或MVC、数据库和数据访问、安全性和性能优化等方面的知识和技能。通过不断学习和实践,可以逐渐提升自己在ASP.NET Web开发领域的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值