C#.Net 上传图片,限制图片大小,检查类型完整版
C#.Net 上传图片,限制图片大小,检查类型完整版C#.Net 上传图片,限制图片大小,检查类型完整版
源代码: 处理图片类,如检查图片大小,按宽度比例缩小图片 public class CImageLibrary { public enum ValidateImageResult { OK, InvalidFileSize, InvalidImageSize } //检查图片大小 public static ValidateImageResult ValidateImage(string file, int MAX_FILE_SIZE, int MAX_WIDTH, int MAX_HEIGHT) { byte[] bs = File.ReadAllBytes(file); double size = (bs.Length / 1024); //大于50KB if (size > MAX_FILE_SIZE) return ValidateImageResult.InvalidFileSize; Image img = Image.FromFile(file); if (img.Width > MAX_WIDTH || img.Height > MAX_HEIGHT) return ValidateImageResult.InvalidImageSize; return ValidateImageResult.OK; } //按宽度比例缩小图片 public static Image GetOutputSizeImage(Image imgSource, int MAX_WIDTH) { Image imgOutput = imgSource; Size size = new Size(imgSource.Width, imgSource.Height); if (imgSource.Width <= 3 || imgSource.Height <= 3) return imgSource; //3X3大小的图片不转换 if (imgSource.Width > MAX_WIDTH || imgSource.Height > MAX_WIDTH) { double rate = MAX_WIDTH / (double)imgSource.Width; if (imgSource.Height * rate > MAX_WIDTH) rate = MAX_WIDTH / (double)imgSource.Height; size.Width = Convert.ToInt32(imgSource.Width * rate); size.Height = Convert.ToInt32(imgSource.Height * rate); imgOutput = imgSource.GetThumbnailImage(size.Width, size.Height, null, IntPtr.Zero); } return imgOutput; } //按比例缩小图片 public static Image GetOutputSizeImage(Image imgSource, Size outSize) { Image imgOutput = imgSource.GetThumbnailImage(outSize.Width, outSize.Height, null, IntPtr.Zero); return imgOutput; } public static byte[] GetImageBytes(string imageFileName) { Image img = Image.FromFile(imageFileName); return GetImageBytes(img); } public static byte[] GetImageBytes(Image img) { if (img == null) return null; try { System.IO.MemoryStream ms = new MemoryStream(); img.Save(ms, ImageFormat.Jpeg); byte[] bs = ms.ToArray(); ms.Close(); return bs; } catch { return null; } } public static Image FromBytes(byte[] bs) { if (bs == null) return null; try { MemoryStream ms = new MemoryStream(bs); Image returnImage = Image.FromStream(ms); ms.Close(); return returnImage; } catch { return null; } } } 上传文件自定义类. 业务逻辑全部在CFileUpload类! public class CFileUpload { private FileUpload _fileUpload; private string _savePath; private string _LastUploadedFile = string.Empty; private bool _AutoGenFileName = false; public string LastUploadedFile { get { return _LastUploadedFile; } } private string PICTURE_FILE = "[.gif.png.jpeg.jpg.bmp]"; private string ZIP_FILE = "[.zip.rar]"; private string MUILT_MEDIA_FILE = "[.mpeg.mpg.fla.exe.wma]"; private int IMG_MAX_WIDTH = 0;//未指定宽度 private int IMG_MAX_HEIGHT = 0;//未指定高度 /// <summary> /// 构造器 /// </summary> /// <param name="fileUpload">Asp.net FileUpload对象</param> /// <param name="savePath">保存目录,不包含文件名</param> /// <param name="autoGenFileName">自动生成文件名</param> public CFileUpload(FileUpload fileUpload, string savePath, bool autoGenFileName) { _savePath = savePath; _fileUpload = fileUpload; _AutoGenFileName = autoGenFileName; } /// <summary> /// 构造器 /// </summary> /// <param name="fileUpload">Asp.net FileUpload对象</param> /// <param name="savePath">保存目录,不包含文件名</param> public CFileUpload(FileUpload fileUpload, string savePath) { _savePath = savePath; _fileUpload = fileUpload; } /// <summary> /// 上传RAR文件 /// </summary> public bool UploadRARFile() { return DoUpload(ZIP_FILE); } /// <summary> /// 上传视频文件 /// </summary> public bool UploadVideo() { return DoUpload(MUILT_MEDIA_FILE); } /// <summary> /// 上传图片文件 /// </summary> public bool UploadImage() { return DoUpload(PICTURE_FILE); } public bool UploadImage(int maxWidth, int maxHeight) { this.IMG_MAX_WIDTH = maxWidth; this.IMG_MAX_HEIGHT = maxHeight; return DoUpload(PICTURE_FILE); } /// <summary> /// 上传任何支持的文件 /// </summary> public bool UploadAnySupported() { return DoUpload(PICTURE_FILE + ZIP_FILE + MUILT_MEDIA_FILE); } /// <summary> /// 生成新的文件名 /// </summary> private string GetNewFileName(string folder, string fileName) { //_AutoGenFileName==true 或者文件名长度>50,自动生成32位GUID文件名 if (_AutoGenFileName || StrUtils.GetStringLength(fileName) >= 50) { string ext = System.IO.Path.GetExtension(fileName); string newfile = Guid.NewGuid().ToString().Replace("-", "") + ext; return folder + newfile; } else { if (System.IO.File.Exists(folder + fileName)) { string ext = System.IO.Path.GetExtension(fileName); string filebody = fileName.Replace(ext, ""); int x = 1; while (true) //如果文件存在,生成尾部带(x)的文件 { string newfile = folder + filebody + "(" + x.ToString() + ")" + ext; if (!System.IO.File.Exists(newfile)) return folder + filebody + "(" + x.ToString() + ")" + ext; else x++; } } else return folder + fileName; } } /// <summary> /// 最大支持小于1MB的文件。 /// </summary> private bool AllowMaxSize(int fileLength) { int MAX_SIZE_UPLOAD = 1024;//最大支持上传小于1MB的文件。 double kb = fileLength / 1024; return (int)kb < MAX_SIZE_UPLOAD; } private bool DoUpload(string allowedExtensions) { bool fileOK = false; if (!_fileUpload.HasFile) return false; //上传控件中如果不包含文件,退出 // 得到文件的后缀 string fileExtension = System.IO.Path.GetExtension(_fileUpload.FileName).ToLower(); // 看包含的文件是否是被允许的文件后缀 fileOK = allowedExtensions.IndexOf(fileExtension) > 0; //检查上传文件大小 fileOK = fileOK & AllowMaxSize(_fileUpload.FileBytes.Length); if (!fileOK) return false; //如检查不通过,退出 try { // 文件另存在服务器指定目录下 string savefile = GetNewFileName(_savePath, _fileUpload.FileName); if (IsUploadImage(fileExtension))//保存图片 { System.Drawing.Image output = CImageLibrary.FromBytes(_fileUpload.FileBytes); // 检查图片宽度/高度/大小 if (this.IMG_MAX_WIDTH != 0 && output.Width > this.IMG_MAX_WIDTH) { output = CImageLibrary.GetOutputSizeImage(output, this.IMG_MAX_WIDTH); } Bitmap bmp = new Bitmap(output); bmp.Save(savefile, output.RawFormat); } else//其它任何文件 { _fileUpload.PostedFile.SaveAs(savefile); } _LastUploadedFile = savefile; return true; } catch { return false; } } private bool IsUploadImage(string fileExtension) { bool isImage = PICTURE_FILE.IndexOf(fileExtension) > 0; return isImage; } } 使用说明: 页面的Button.Click事件 protected void btnUploadImg_Click(object sender, EventArgs e)
{ try { if (!FileUploadImg.HasFile) return; string virtualFilePath = "~//" + CAppConfiguration.Current.BbsUploadFilePath; string savePath = this.Server.MapPath(virtualFilePath); //保存文件物理路径 //调用CFileUpload类 CFileUpload upload = new CFileUpload(FileUploadImg, savePath, false); //上传图片文件 bool ret = upload.UploadImage(); if (ret) { string filename = System.IO.Path.GetFileName(upload.LastUploadedFile); string imgHTML = "<img alt=''''贴图图片'''' src=''''{0}'''' />"; this.hfLastUploadImage.Value = filename; string root = CGlobals.GetHttpRoot(this); imgHTML = string.Format(imgHTML, root + "/" + CAppConfiguration.Current.BbsUploadFilePath + filename); FreeTextBox1.Text = FreeTextBox1.Text + "<br/>" + imgHTML; lblUploadImg.ForeColor = Color.Green; lblUploadImg.Visible = true; lblUploadImg.Text = "上传文件成功!"; } else { lblUploadImg.ForeColor = Color.Red; lblUploadImg.Visible = true; lblUploadImg.Text = "不支持格式或上传失败!"; } } catch (Exception ex) { CMsg.ShowException(this, ex); } }
参考文档:
Asp.Net(C#)发送带有附件及显示图片的邮件 DevExpress表格打印预览及自定义页眉页脚并绘制图片(C# Winform) 基于C#.NET三层架构的物流运输管理系统(TMS)成功案例 基于C#.NET标准三层架构订单管理系统 (OMS)|C/S框架网 C#.NET二次开发框架,二次开发平台产品介绍-C/S框架网 Winform自动升级框架源码(C#.NET)-C/S框架网 C#.Net与SQLServer时间范围的最小值最大值 CImageLibrary类修复GetImageBytes方法获取图片大小 WebApi服务端开发框架成功案例-对接三方支付平台连连支付C#.NET C#.NET WebApi开发框架成功案例-物流行业TMS系统+APP+微信小程序 C#.NET WebApi开发框架成功案例-物流行业系统对接|满帮集团|中交兴路|福佑卡车 C#.NET快速开发框架成功案例-港口散杂货管理系统,港口管理信息系统MIS C#.NET最好用的主流开发框架 - 开源框架平台 - C/S框架网 VS.NET后端框架,C#.NET开发的服务器端开发框架 - C/S框架网 C#.NET IP端口绑定SSL证书支持HTTPS协议(用于Win服务自承载WebApi服务器) - C/S框架网原创
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |