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. 《Automatic Face Classification of Cushing’s Syndrome in Women – A Novel Screening Approach》学习笔记

    <针对女性库欣综合征患者的自动面部分类-一种新颖的筛查方法> Abstract 目的:库兴氏综合征对身体造成相当大的伤害如果不及时治疗,还经常是诊断的时间太长.在这项研究中,我们旨在测试面 ...

  2. 用c#开发微信 (7) 微渠道 - 推广渠道管理系统 2 业务逻辑实现

    我们可以使用微信的“生成带参数二维码接口”和 “用户管理接口”,来实现生成能标识不同推广渠道的二维码,记录分配给不同推广渠道二维码被扫描的信息.这样就可以统计和分析不同推广渠道的推广效果. 上次介绍了 ...

  3. linux下vi操作出现E325: ATTENTION的解决方法

    #rm  ***.***.swp #rm: remove regular file `.Test.java.swp'? y # OK,完成.再用VI打开就可以了.

  4. 解决dnu restore时的“Cannot handle address family”问题

    前几天在使用基于 mono 的 dnx 中的 dnu restore 命令安装 nuget 包包时,遇到了 “Cannot handle address family” 错误,错误详情如下: Cann ...

  5. WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...

  6. Spec 网上选课

    角色定义 管理员 管理员负责向系统中添加学生和教师的个人信息以及课程信息,实现对教师.学生和课程信息的修改.删除.查询操作,并对管理员个人密码进行修改. 学生 学生具有查看待选课程信息和任课教师信息. ...

  7. Apache axis2 + Eclipse 开发 WebService

    yd小结注意:1.axis2的2个插件的版本必须与引入的jar包匹配,如果不同则可能报以下错误 “没有实现序列化方法”或 “org.apache.axis2.databinding.utils.wri ...

  8. Jenkins pipeline 入门到精通系列文章

    Jenkins2 入门到精通系列文章. Jenkins2 下载与启动jenkins2 插件安装jenkins2 hellopipelinejenkins2 pipeline介绍jenkins2 jav ...

  9. SharePoint Client Object Model API 介绍以及工作原理解析

    CSOM和ServerAPI 的对比 SharePoint从2010开始引入了Client Object Model的API(后文中用CSOM来代替),从名字来看,我们可以简单的看出,该API是面向客 ...

  10. CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\f834824f\75776659\xxx.dll”--“拒绝访问。 ”

    解决方法: 1.找到C:\windows\Temp文件夹 右键属性-->安全选项卡,给IIS_IUSRS帐号赋予权限