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. day5----正则

    %a    本地(locale)简化星期名称     %A    本地完整星期名称     %b    本地简化月份名称     %B    本地完整月份名称     %c    本地相应的日期和时间 ...

  2. 揭秘Sql2014新特性-tempdb性能提升

    一直以来,在高负载,复杂的生产环境中,tempdb的压力是成为整个实例瓶颈的重要因素之一.微软的工程师们也在各个版本中不断优化它的使用.到了Sql Server2014又有了新的特性使其性能得temp ...

  3. Libgls 1.0.1 发布,OpenGL 立体渲染

    Libgls 1.0.1 只是修复了一些小问题,更新了 FindGLS.cmake 脚本. Libgls 允许 OpenGL 立体渲染,不需要硬件支持四缓冲立体.支持许多立体显示模式,从立体眼镜的3D ...

  4. 大熊君说说JS与设计模式之------命令模式Command

    一,总体概要 1,笔者浅谈 日常生活中,我们在看电视的时候,通过遥控器选择我们喜欢的频道时,此时我们就是客户端的角色,遥控器的按钮相当于客户请求,而具体执行的对象就是命令对象, 命令模式把一个请求或者 ...

  5. 在.sln文件中设置Visual Studio默认启动项目的简单方法

    昨天在一台电脑上用git新签出一个项目进行build,却出现一堆编译错误,而在原先的开发机上build无任何错误.对比分析后发现,开发机上VS的启动项目(startup project)与这台电脑上的 ...

  6. Android UI开发【开篇导航】

    如今移动互联网正处于飞速发展的时期,正式看中这个行业的发展势头,本人在2011年从.NET转行做了移动应用开发这块,接触了android和ios开发,到今已快3个年头,先前忙于学习各种基础知识和语法方 ...

  7. 高手速成android开源项目【blog篇】

    主要介绍那些乐于分享并且有一些很不错的开源项目的个人和组织.Follow大神,深挖大神的项目和following,你会发现很多. 一.个人 JakeWharton 就职于SquareGithub地址: ...

  8. JavaScript自定义事件

    很多DOM对象都有原生的事件支持,向div就有click.mouseover等事件,事件机制可以为类的设计带来很大的灵活性,相信.net程序员深有体会.随着web技术发展,使用JavaScript自定 ...

  9. httpwebrequest 请求压缩,接受压缩的字符流请求

    请看图,客户端和服务端都使用gzip压缩. 客户端参数以json字符串形式gzip压缩,以二进制流发送到服务端:服务端接收到请求,解压缩gzip后,进行业务逻辑处理:处理完后在将返回值以json形式, ...

  10. Nagios学习笔记一:基本安装和配置

    ()解决安装Nagios的依赖关系: Nagios基本组件的运行依赖于httpd.gcc和gd.可以通过以下命令来检查nagios所依赖的rpm包是否已经完全安装: # yum -y install ...