C#.Net 上传图片,限制图片大小,检查类型完整版

源代码:


处理图片类,如检查图片大小,按宽度比例缩小图片

public class CImageLibrary
{
   public enum ValidateImageResult { OK, InvalidFileSize, InvalidImageSize }
   
   //检查图片大小 
   public static ValidateImageResult ValidateImage(string file, int MAX_FILE_SIZE, int MAX_WIDTH, intMAX_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) returnValidateImageResult.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);
   }
}

C#.Net 上传图片,限制图片大小,检查类型完整版的更多相关文章

  1. jquery实现上传图片及图片大小验证、图片预览效果代码

    jquery实现上传图片及图片大小验证.图片预览效果代码 jquery实现上传图片及图片大小验证.图片预览效果代码 上传图片验证 */ function submit_upload_picture() ...

  2. 关于PHP HTML <input type="file" name="img"/>上传图片,图片大小,宽高,后缀名。

    在我们的系统中,不免要上传图片,视频等文件,在上传中,需要做的一些判断,文件大小等方面. 注意: 在php.ini 中的post_max_size,upload_max_filesize默认为2M,在 ...

  3. 判断pdf、word文档、图片等文件类型(格式)、大小的简便方法

    判断pdf.word文档.图片等文件类型(格式).大小的简便方法 很久没发文了,今天有时间就写一下吧. 关于上传文件,通常我们都需要对其进行判断,限制上传的类型,如果是上传图片,我们甚至会把图片转化成 ...

  4. SpringMVC 图片上传,检查图片大小

    使用SpringMVC+Spring 前端提交图片文件到Controller,检查上传图片大小是否符合要求 直接上代码了 1.校验图片大小 这里提供出验证的方法,用于在需要校验的地方调用 /** * ...

  5. js 上传图片,用户自定义截取图片大小

    js 上传图片,用户自定义截取图片大小 js 组件

  6. java关于图片处理修改图片大小

    最近做了一个关于图片浏览的内容.因为图片都是一些证件的资料的扫描件所以比较大,对系统的影响也是非常之大的,有很大可能直接把系统干死.那么我是这么处理的,给大家分享一下.如果大家有好的方案的话一定要早点 ...

  7. 在ASP.NET MVC下实现单个图片上传, 客户端服务端双重限制图片大小和格式, 服务端裁剪图片

    在"MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件01-单文件上传"一文中,使用JSAjaxFileUploader这款插件实现了单文 ...

  8. struts2--上传总结(限制大小和类型 非法上传的跳转)

    网上有很多版本,鉴于实践出真知的态度 我自己探索了一番 struts版本:2.3.16 限制大小: struts2默认是2M 所以如果要扩大大小限制,应该先配一个全局struts2最大上限 <c ...

  9. 图片处理:html文本获取图片Url,判断图片大小,存数据库

    1.从html文本获取图片Url /** * html文本中取出url链接 */ public class Url { public static void main(String[] args) { ...

随机推荐

  1. VIM编辑器的命令

    最近看书,说要熟悉一个文本编辑器的用法最好,在mac上找来找去,发现还是VIM最简单,是自带的,哈哈,决定先转下常用的命令,后续如果有时间,可以慢慢试用,慢慢分类,以下: VIM命令大全 保存文本和退 ...

  2. SQLSERVER 2012之AlwaysOn -- 同步模式下的网卡性能优化

    本文是基于上一篇<SQLServer 2012之AlwaysOn -- 指定数据同步链路,消除网络抖动导致的提交延迟问题>的问题继续进行优化:具体背景请参照上文:     前后折腾了一个多 ...

  3. 我的Linux随笔目录

    现在整理博客的时间少了,大多是在用为知笔记收藏和整理,一次集中发点Linux相关随笔整理和一个目录,是按时间顺序来的.每一篇都是自己用过之后整理的,应用场景已经尽可能的说明了,不明白的可以Q我,上班时 ...

  4. WebApi 服务监控

    本文主要介绍在请求WebApi时,监控Action执行的时间,及Action传递的参数值,以及Http请求头信息.采用log4net记录监控日志,通过日志记录的时间方便我们定位哪一个Action执行的 ...

  5. Linux系列笔记 - vim相关记录

    一.常用到的vim命令 这里只简单记录常用到的命令,后面会有自己记录的命令,但有些可能不常用. 常规模式: gg 跳到文件头 shift+g 跳到文件尾 行数+gg 跳到指定行 如:123gg 跳到1 ...

  6. ASP.NET 5系列教程 (二):Hello World

    本篇文章内容比较基础,主要是向大家展示如何创建一个 ASP.NET 5 工程,主要包含内容如下: 创建ASP.NET 5 工程 添加 Todo 控制器 安装 K Version Manager 执行 ...

  7. iOS企业级开发

    2015移动技术白皮书 Android篇 iOS篇 项目管理篇 综合篇 结束语 iOS项目框架设计 项目结构的设计 基类的设计 自定义生命周期 跳转器 自定义UV打点控件 图片缓存 iOS网络底层框架 ...

  8. Visitor模式,Decorator模式,Extension Object模式

    Modem结构 Visitor模式 对于被访问(Modem)层次结构中的每一个派生类,访问者(Visitor)层次中都有一个对应的方法. 从派生类到方法的90度旋转. 新增类似的Windows配置函数 ...

  9. Call and Apply in JavaScript

    Call 和 Apply 方法可以用来代替另一个对象调用一个方法,改变this指向. 1.call -call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) -调用一 ...

  10. [推荐]Zookeeper大型分布式系统的可靠协调系统知识介绍

    [推荐]Zookeeper大型分布式系统的可靠协调系统知识介绍 基于Zookeeper的锁开发手册 http://wenku.baidu.com/view/acbb8fc6102de2bd960588 ...