A-A+

生成缩略图并上传到远程服务器

2008年05月06日 編程·程序設計 暂无评论 阅读 3,588 views 次

c#上传图片时生成缩略图并上传到文件服务器。由于代码中涉及一些其他控件,如上传控件之类的,本文就不做描述也不提供下载。缩略图的裁剪大小可在webconfig里面定义,下面是代码部分:

C#代码
  1. /// <summary>   
  2. /// 生成缩略图   
  3. /// </summary>   
  4. /// <param name="mode">生成缩略图的方式:“HW”:指定高宽缩放(可能变形),"W":指定宽,高按比例,"H"://指定高,宽按比例 ,"Cut"://指定高宽裁减(不变形)</param>   
  5. private string MakeThumbImg(string mode)   
  6. {   
  7.     string fileServer = ConfigurationManager.AppSettings["UploadVirtualPath"];   
  8.   
  9.     //缩略图宽度   
  10.     int thumbWidth = DBUtils.ToInt32(ConfigurationManager.AppSettings["ThumbWidth"]);   
  11.     //缩略图高度   
  12.     int thumbHeight = DBUtils.ToInt32(ConfigurationManager.AppSettings["ThumbHeight"]);   
  13.   
  14.     HttpPostedFile file = Request.Files[0];   
  15.     HttpContext ctx = HttpContext.Current;   
  16.     if (string.IsNullOrEmpty(file.FileName))   
  17.         return "";   
  18.     string ImgName = UpDownLoadUtils.UploadFile("~\\Uploads\\Temp\\", file);  
  19.     string ImagePath = ctx.Server.MapPath("~\\Uploads\\Temp\\") + ImgName;  
  20.  
  21.     //缩略图保存目录          
  22.     string thumbImgPath = ctx.Server.MapPath("~\\Uploads\\Temp\\thumb_") + ImgName;  
  23.  
  24.     System.Drawing.Image originalImage = System.Drawing.Image.FromFile(ImagePath);  
  25.  
  26.     int towidth = thumbWidth;  
  27.     int toheight = thumbHeight;  
  28.  
  29.     int x = 0;  
  30.     int y = 0;  
  31.     int ow = originalImage.Width;  
  32.     int oh = originalImage.Height;  
  33.  
  34.     switch (mode)  
  35.     {  
  36.         case "HW"://指定高宽缩放(可能变形)                  
  37.             break;  
  38.         case "W"://指定宽,高按比例                      
  39.             toheight = originalImage.Height * thumbWidth / originalImage.Width;  
  40.             break;  
  41.         case "H"://指定高,宽按比例  
  42.             towidth = originalImage.Width * thumbHeight / originalImage.Height;  
  43.             break;  
  44.         case "Cut"://指定高宽裁减(不变形)  
  45.             if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)  
  46.             {  
  47.                 oh = originalImage.Height;  
  48.                 ow = originalImage.Height * towidth / toheight;  
  49.                 y = 0;  
  50.                 x = (originalImage.Width - ow) / 2;  
  51.             }  
  52.             else  
  53.             {  
  54.                 ow = originalImage.Width;  
  55.                 oh = originalImage.Width * thumbHeight / towidth;  
  56.                 x = 0;  
  57.                 y = (originalImage.Height - oh) / 2;  
  58.             }  
  59.             break;  
  60.         default:  
  61.             break;  
  62.     }  
  63.  
  64.     //新建一个bmp图片  
  65.     System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);  
  66.  
  67.     //新建一个画板  
  68.     System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);  
  69.  
  70.     //设置高质量插值法  
  71.     g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;  
  72.  
  73.     //设置高质量,低速度呈现平滑程度  
  74.     g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;  
  75.  
  76.     //清空画布并以透明背景色填充  
  77.     g.Clear(System.Drawing.Color.Transparent);  
  78.  
  79.     //在指定位置并且按指定大小绘制原图片的指定部分  
  80.     g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight),  
  81.         new System.Drawing.Rectangle(x, y, ow, oh),  
  82.         System.Drawing.GraphicsUnit.Pixel);  
  83.  
  84.     try  
  85.     {  
  86.         //以jpg格式保存缩略图  
  87.         bitmap.Save(thumbImgPath, System.Drawing.Imaging.ImageFormat.Jpeg);  
  88.     }  
  89.     catch (System.Exception e)  
  90.     {  
  91.         throw e;  
  92.     }  
  93.     finally  
  94.     {  
  95.         originalImage.Dispose();  
  96.         bitmap.Dispose();  
  97.         g.Dispose();  
  98.     }  
  99.  
  100.     //文件服务器初始化  
  101.     System.Web.UI.Page page = new Page();  
  102.     FileManager fu = new FileManager(page.Server.MapPath("~/libs/FileSever.xml"));  
  103.  
  104.     System.IO.FileStream fs = System.IO.File.OpenRead(thumbImgPath);  
  105.  
  106.     string filename = "";   
  107.     //上传文件到文件服务器   
  108.     if (file.ContentLength > 0)   
  109.     {   
  110.         //在文件名后增加日期时间标识以确保文件名唯一   
  111.         filename = GetUniqueFileName2(thumbImgPath);   
  112.         if (fu.UploadFile((System.IO.Stream)fs, System.IO.Path.GetFileName(filename)))   
  113.         {   
  114.             fs.Close();   
  115.             //删除临时文件   
  116.             System.IO.File.Delete(ImagePath);   
  117.             System.IO.File.Delete(thumbImgPath);   
  118.             return fileServer + filename;   
  119.         }   
  120.     }   
  121.     fs.Close();   
  122.     System.IO.File.Delete(ImagePath);   
  123.     System.IO.File.Delete(thumbImgPath);   
  124.     return fileServer + filename;   
  125. }  

下面是在文件名后增加日期时间标识以确保文件名唯一的方法:

C#代码
  1. /// <summary>   
  2. /// 在文件名后增加日期时间标识以确保文件名唯一   
  3. /// </summary>   
  4. /// <param name="fileName"></param>   
  5. /// <returns></returns>   
  6. public static string GetUniqueFileName2(string fileName)   
  7. {   
  8.     StringBuilder sb = new StringBuilder();   
  9.     if (fileName.LastIndexOf(".") > 0)   
  10.     {   
  11.         sb.Append(GetFileNameByPath(fileName));   
  12.         sb.Append("_");   
  13.         sb.Append(DateTime.Now.ToString("yyyyMMddHHmmss"));   
  14.         sb.Append('.');   
  15.         sb.Append(GetPostfixName(fileName));   
  16.   
  17.     }   
  18.     else  
  19.     {   
  20.         sb.Append(fileName);   
  21.         sb.Append("_");   
  22.         sb.Append(DateTime.Now.ToString("yyyyMMddHHmmss"));   
  23.     }   
  24.     return sb.ToString();   
  25. }  

给我留言

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。

Copyright © 寂寞部屋 保留所有权利.   Theme  Ality

用户登录