11
2012
06

C# 自定义比例上传图片,压缩比例大小图片

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

1.缩小图片:

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; }
    }
}
2.自定义类:

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;
    }
}

3.事件:

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);
    }
}
« 上一篇下一篇 »

相关文章:

评论列表:

1.荷兰网  2015/2/22 14:12:12 回复该留言
不错的文章,内容点石成金.

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。