zoukankan      html  css  js  c++  java
  • Asp.Net HttpPostedFile和base64两种上传图片(文件)方式

          之前上传图片基本都是用的HttpPostedFile方式获取图片,这次因为需求关系,要对准备上传的图片进行删除,最后提交的时候才去保存图片到服务器,

    找了下资料,html5有个新的东西出来,js 里面的FileReader用法也写下,有了这个可以很快速的开发一个适配的图片上传插件出来

    $('#img_upload').change(function () {// img_upload 为 input 标签的id
            var maxsize = 2 * 1024 * 1024;//2M
            var file = this.files[0];
            var size = this.files[0].size;
            var suffix = file.name.split('.')[1];
    // 前端初步判断下后缀名是否为图片,更为精确的方式要在服务器端进行 if (suffix.toLowerCase() != "jpg" && suffix.toLowerCase() != "jpeg" && suffix.toLowerCase() != "gif" && suffix.toLowerCase() != "png") { alert("请上传JPG、JPEG、GIF与PNG格式的图片"); return; } if (size >= maxsize) { alert("上传的文件必须小于2M!!!"); return; } var r = new FileReader(); r.readAsDataURL(file); $(r).load(function () { document.getElementById("avatarimg").src = this.result;// this.result 就是 data:image/jpeg;base64,开头的base64格式图片 }); });

      服务器端处理如下

        /// <summary>
        /// 将 html5 FileReader 读出来的base64格式图片转化成一定格式的图片存起来
        /// </summary>
        /// <param name="base64Str">开头为data:image/jpeg;base64, + base64图片字符串</param>
        /// <param name="domain">引用程序域名</param>
        /// <param name="savePath">根目录开始的保存路径: uploadfile\201703 不存在该路径则会自动创建 </param>
        /// <param name="saveName">2017030278787.jpg 中"." 前一段</param>
        /// <param name="extension">.jpg</param>
        /// <param name="limitSize">限制字节长度</param>
        /// <returns>1:面向用户的错误信息  </returns>
        public static SaveImageResult SaveBase64StrToImage(string base64Str, string domain, string savePath, string saveName, string extension, long limitSize)
        {
            SaveImageResult result = new SaveImageResult();
            string imgFullName = saveName + extension;  // 格式类似 20170903787878.jpg
            try
            {
                result.ReturnPath = domain + "/" + savePath.Replace("\", "/") + "/" + imgFullName;// 格式类似 http:axx.xxx.com/uploadfile/2017/03/201709044645545454.jpg
            }
            catch (Exception)
            {
                throw new Exception("参数savePath格式错误");
            }
            byte[] arr = null;
            try
            {
                arr = Convert.FromBase64String(base64Str.Substring(base64Str.IndexOf("base64,") + 7));//切除前面那段image标识
            }
            catch (Exception)
            {
                throw new Exception("参数base64Str格式错误");
            }
    
            long size = arr.LongLength;
    
            if (size <= limitSize)// 判断文件大小是否超出限制
            {
                string path = System.Web.HttpRuntime.AppDomainAppPath + savePath;// 获取物理路径
    
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
    
                using (MemoryStream ms = new MemoryStream(arr))
                {
                    try
                    {
                        Bitmap bmp = new Bitmap(ms);// 此处如果传入的不是一张图片,这里会抛异常
                        bmp.Save(path + "\" + imgFullName);
    }
    catch (Exception)
    {
    throw new Exception("图片保存失败,请检查传入参数");
    }
    }
    }
    else
    {
    result.ErrorCode
    = 1;
    result.ErrorMessage
    = "图片超过限制大小";
    }
    if (result.ErrorCode != 0)// 如果有出错,返回路径变成空
    {
    result.ReturnPath
    = "";
    }
    return result;
    }

        /// <summary>
        /// base64格式转图片存储结果
        /// 
        /// </summary>
        public class SaveImageResult
        {
            /// <summary>
            /// 0:无错误 1:面向用户的错误信息
            /// </summary>
            public int ErrorCode { get; set; }
    
            /// <summary>
            /// 错误信息
            /// </summary>
            public string ErrorMessage { get; set; }
    
            /// <summary>
            /// 返回用于存储的路径
            /// </summary>
            public string ReturnPath { get; set; }
    
        }
    
    
    
     
     

     base64方式讲完,下面再附上一个普通的HttpPostedFile方式上传的方法

    /// <summary>
        ///  保存上传的图片,自带用Image对象的方式判断是否为图片,自动获取后缀名
        /// </summary>
        /// <param name="file">文件 ,该参数可由System.Web.Request.Files集合的索引来得到</param>
        /// <param name="savePath">根目录开始的保存路径: uploadfile\201703 不存在该路径则会自动创建 </param>
        /// <param name="saveName">2017030278787.jpg 中"." 前一段</param>
        /// <param name="limitSize">限制字节长度</param>
        /// <returns></returns>
        public static SaveImageResult SaveImage(System.Web.HttpPostedFile file, string domain, string savePath, string saveName, long limitSize)
        {
            SaveImageResult result = new SaveImageResult();
            if (file == null)
            {
                result.ErrorCode = 1;
                result.ErrorMessage = "请上传图片";
            }
            string extension = System.IO.Path.GetExtension(file.FileName);// 获取后缀名
            string imgFullName = saveName + extension;  // 格式类似 20170903787878.jpg
            try
            {
                result.ReturnPath = domain + "/" + savePath.Replace("\", "/") + "/" + imgFullName;// 格式类似 http:app.darchin.com/uploadfile/2017/03/201709044645545454.jpg
            }
            catch (Exception)
            {
                throw new Exception("参数savePath格式错误");
            }
            if (file.ContentLength <= limitSize)// 判断文件大小是否超出限制
            {
                System.Drawing.Image img = null;
                try
                {
                    img = System.Drawing.Image.FromStream(file.InputStream);
                }
                catch (Exception)
                {
                    result.ErrorCode = 1;
                    result.ErrorMessage = "请上传正确格式的图片";
                }
    
                string path = System.Web.HttpRuntime.AppDomainAppPath + savePath;// 获取物理路径
    
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                try
                {
                    img.Save(path + "\" + imgFullName);
                }
                catch (Exception)
                {
                    throw new Exception("图片保存失败,请检查传入参数");
                }
    
            }
            else
            {
                result.ErrorCode = 1;
                result.ErrorMessage = "上传的图片超过限制大小";
            }
            if (result.ErrorCode != 0)// 如果有出错,返回路径变成空
            {
                result.ReturnPath = "";
            }
            return result;
        }

    如果上面所讲有错或者不足的地方还请各位朋友指出,感激不尽

  • 相关阅读:
    unittest模块小结
    自定义日志类
    配置文件的简单操作
    自动化框架搭建(一)
    openpyxl一点心得
    关于过滤字符中不同元素小结
    关于传入列表出现元素次数排序题目的一点心得
    Python中*和**的作用(课堂小结)
    Python代码的人机大战(循环嵌套)
    最后期限阅读笔记02
  • 原文地址:https://www.cnblogs.com/shellphen/p/6611275.html
Copyright © 2011-2022 走看看