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. linux tcp协议定时器

    1 连接建立定时器:75秒 2 保活定时器:2小时又10分钟 3 重传定时器:根据RTT计算 4 2MSL定时器:最大报文段存活时间 5 持续定时器

  2. 获取root权限

    1.用root建立一个普通用户mary,并切换到mary. < 2.我们首先测试一下当前用户的权限 3.进入到/tmp,新建目录abc. 4.执行下列相关命令.并保证最后一行后面的两块红色部分为 ...

  3. iOS开发之组件化架构漫谈

    前段时间公司项目打算重构,准确来说应该是按之前的产品逻辑重写一个项目.在重构项目之前涉及到架构选型的问题,我和组里小伙伴一起研究了一下组件化架构,打算将项目重构为组件化架构.当然不是直接拿来照搬,还是 ...

  4. 在Mac/Linux/Windows上编译corefx遇到的问题及解决方法

    这两天尝试在Mac/Linux/Windows三大平台上编译.NET跨平台三驾马车(coreclr/corefx/dnx)之一的corefx(.NET Core Framework),结果三个平台的编 ...

  5. SQL Server中DateTime与DateTime2的区别

    DateTime字段类型对应的时间格式是 yyyy-MM-dd HH:mm:ss.fff ,3个f,精确到1毫秒(ms),示例 -- ::15.433 . DateTime2字段类型对应的时间格式是  ...

  6. 微软BI 之SSIS 系列 - Precedence Constraint 详解优先约束的使用

    开篇介绍 Precedence Constraint 优先约束 - 在控制流中使用,用来链接控制流中各种 Task,Container,并且要求满足一定的条件才能执行相关联的 Task 或者 Cont ...

  7. Windows 10四大版本区别详解:家庭版, 专业版, 企业版和教育版

    Windows 10有四个基本版本:Windows 10 家庭版, Windows 10 专业版, Windows 10 企业版, 和Windows 10 教育版(这是Windows家族的新成员).以 ...

  8. iOS企业级开发

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

  9. javascript变量名提升

    预解析的过程 代码的执行过程 程序在执行过程,会先将代码读取到内存中检查,会将所有的声明在此时进行标记.所谓的标记就是让js解释器直到有这个名字,后面在使用名字的时候,不会出现未定义的错误,这个标记就 ...

  10. .NET读取Office文件内容(word、excel、ppt)

    引用命名空间 using Microsoft.Office.Core; using Word = Microsoft.Office.Interop.Word; using Excel = Micros ...