[原创]ASP.NET 自定义文件上传用户控件

原文链接: http://dev.mjxy.cn/a-aspnet-Upload-file.aspx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UpFile.ascx.cs" Inherits="UpFile" %>
<div style="margin: 10px;">
选择要上传的文件:<br />
<input id="UpLoadFile" type="file" runat="server" />
<input id="Button1" type="button" value="上传" runat="server" onserverclick="Button1_ServerClick" />
<br />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="UpLoadFile"
    ErrorMessage="请选择要上传的文件"></asp:RequiredFieldValidator>
</div>

代码文件如下:

001 using System;
002 using System.Data;
003 using System.Configuration;
004 using System.Collections;
005 using System.Web;
006 using System.Web.Security;
007 using System.Web.UI;
008 using System.Web.UI.WebControls;
009 using System.Web.UI.WebControls.WebParts;
010 using System.Web.UI.HtmlControls;
011 using System.IO;
012   
013 /// <summary>
014 /// 水印用户控件
015 /// 作者:成海涛
016 /// 时间:2006-9-21
017 /// E-mail:kingter520@163.com
018 /// 说明:文字水印的位置有待完善,建议用图片水印
019 /// </summary>
020 public partial class UpFile : System.Web.UI.UserControl
021 {
022   
023     string _strNewFileFolder = System.Configuration.ConfigurationSettings.AppSettings["FCKeditor:BasePath"];      //文件上传的目录
024     string _UploadDeniedExtensions = System.Configuration.ConfigurationSettings.AppSettings["UploadDeniedExtensions"];   //只允许上传的文件扩展名 ".(jpg|gif|jpeg|png)$"
025     int _NewImgpx = 120;                            //缩略图尺寸
026     bool _IsThumb = true;                           //是否启用缩略图 true:启用  false:不启用
027     bool _IsWatermark = false;                       //是否启用水印 true:启用  false:不启用
028     int _WatemarkPos = 9;                           //水印位置 1:左上角 2:水平居中垂直顶部 3:右上角 4:垂直居中水平靠左 5:居中 6:垂直居中水平靠右 7:左下角 8:水平居中垂直底部 9:右下角
029     string _WatemarkType = "txt";                   //水印类型 txt:文字水印 img:图片水印
030     string _WatemarkText = "西部数字网 www.idcwest.net";            //水印文字
031     string _WatemarkFont = "Verdana";               //水印字体
032     string _WatemarkTextColor = "#FFFFFF";          //水印文字颜色
033     int _WatemarkFontSize = 18;                     //水印文字像素
034     string _WatemarkImg = "mark.png";               //水印图片
035     int _FileSizeMax = 2048;                        //限制上传文件大小
036   
037     string _srcFileName;                            //上传文件原文件名
038     string _srcFileExtension;                       //扩展名
039     string _strFileName;                            //新文件名
040     string _strFileType;                            //文件类型
041     int _strFileSize;                               //文件大小 单位 KB
042     int _OldFileWidth;                              //原图宽度
043     int _OldFileHeight;                             //原图高度
044     int _NewImgHeight;                              //缩略图高度
045     int _NewImgWidth;                               //缩略图宽度
046     string _thumbImgPath;                           //缩略图完整地址
047     string _imagePath;                              //返回上传图片完整地址
048     string _errMsg;                                 //返回出错提示
049   
050     string _strFileFolder;
051     int _WatemarkPosX = 5;
052     int _WatemarkPosY = 5;
053   
054     DateTime now = DateTime.Now;                    //取当前的时间到DateTime类的对象now中
055   
056     public delegate void OnUploadEvent(object sender, EventArgs e);
057     public event OnUploadEvent OnUpload;
058   
059     /// <summary>
060     /// 设置文件上传的目录
061     /// </summary>
062     public string NewFileFolder
063     {
064         set { _strNewFileFolder = value; }
065     }
066   
067     /// <summary>
068     /// 设置缩略图的尺寸
069     /// </summary>
070     public int NewImgpx
071     {
072         set { _NewImgpx = value; }
073     }
074   
075     /// <summary>
076     /// 是否启用缩略图
077     /// </summary>
078     /// 
079     public bool IsThumb
080     {
081         set { _IsThumb = value; }
082     }
083   
084     /// <summary>
085     /// 是否启用水印
086     /// </summary>
087     public bool IsWatermark
088     {
089         set { _IsWatermark = value; }
090     }
091   
092     /// <summary>
093     /// 设置水印位置
094     /// </summary>
095     public int WatemarkPos
096     {
097         set { _WatemarkPos = value; }
098     }
099   
100     /// <summary>
101     /// 设置水印类型 txt:文字水印 img:图片水印
102     /// </summary>
103     public string WatemarkType
104     {
105         set { _WatemarkType = value; }
106     }
107   
108     /// <summary>
109     /// 设置水印文字
110     /// </summary>
111     public string WatemarkText
112     {
113         set { _WatemarkText = value; }
114     }
115   
116     /// <summary>
117     /// 设置水印字体
118     /// </summary>
119     public string WatemarkFont
120     {
121         set { _WatemarkFont = value; }
122     }
123   
124     /// <summary>
125     /// 设置水印字号
126     /// </summary>
127     public int WatemarkFontSize
128     {
129         set { _WatemarkFontSize = value; }
130     }
131   
132     /// <summary>
133     /// 设置水印文字颜色
134     /// </summary>
135     public string WatemarkTextColor
136     {
137         set { _WatemarkTextColor = value; }
138     }
139     /// <summary>
140     /// 设置水印图片
141     /// </summary>
142     public string WatemarkImg
143     {
144         set { _WatemarkImg = value; }
145     }
146     /// <summary>
147     /// 设置上传文件的限制大小
148     /// </summary>
149     public int FileSizeMax
150     {
151         set { _FileSizeMax = value; }
152     }
153   
154     /// <summary>
155     /// 上传文件原文件名
156     /// </summary>
157     public string OldFileName
158     {
159         get { return _srcFileName; }
160     }
161   
162     /// <summary>
163     /// 扩展名
164     /// </summary>
165     public string OldFileExtension
166     {
167         get { return _srcFileExtension; }
168     }
169   
170     /// <summary>
171     /// 新文件名
172     /// </summary>
173     public string FileName
174     {
175         get { return _strFileName; }
176     }
177   
178     /// <summary>
179     /// 文件类型
180     /// </summary>
181     public string FileType
182     {
183         get { return _strFileType; }
184     }
185     /// <summary>
186     /// 文件大小 单位 KB
187     /// </summary>
188     public int FileSize
189     {
190         get { return _strFileSize; }
191     }
192   
193     /// <summary>
194     /// 原图宽度
195     /// </summary>
196     public int OldFileWidth
197     {
198         get { return _OldFileWidth; }
199     }
200   
201     /// <summary>
202     /// 原图高度
203     /// </summary>
204     public int OldFileHeight
205     {
206         get { return _OldFileHeight; }
207     }
208   
209     /// <summary>
210     /// 缩略图高度
211     /// </summary>
212     public int ThumbImageHeight
213     {
214         get { return _NewImgHeight; }
215     }
216   
217     /// <summary>
218     /// 缩略图宽度
219     /// </summary>
220     public int ThumbImageWidth
221     {
222         get { return _NewImgWidth; }
223     }
224   
225     /// <summary>
226     /// 缩略图完整地址
227     /// </summary>
228     public string ThumbImagePath
229     {
230         get { return _thumbImgPath; }
231     }
232   
233     /// <summary>
234     /// 返回上传图片完整地址
235     /// </summary>
236     public string FilePath
237     {
238         get { return _imagePath; }
239     }
240   
241     /// <summary>
242     /// 返回出错提示
243     /// </summary>
244     public string ErrMsg
245     {
246         get { return _errMsg; }
247     }
248   
249     protected void Page_Load(object sender, EventArgs e)
250     {
251         _WatemarkImg = Server.MapPath("~/") + _WatemarkImg; //水印图片
252   
253         //文件上传的目录
254         _strNewFileFolder += now.Year.ToString() + "/";
255         _strFileFolder = Server.MapPath("~/") + _strNewFileFolder;
256     }
257   
258     protected void Button1_ServerClick(object sender, EventArgs e)
259     {
260         //随机数
261         Random Rnd = new Random();
262         int strRnd = Rnd.Next(1, 99);
263   
264         //新文件名称
265         string strFileName = now.Month.ToString() + now.Day.ToString() + now.Hour.ToString() + now.Minute.ToString() + now.Second.ToString() + strRnd.ToString();
266   
267         if (UpLoadFile.PostedFile.ContentLength != 0)  //判断选取对话框的文件长度是否为0
268         {
269   
270             //检测目录是否存在,不存在就建立目录
271             if (!Directory.Exists(_strFileFolder))
272             {
273                 Directory.CreateDirectory(_strFileFolder);
274             }
275   
276             //获取原文件信息
277             string srcFile = UpLoadFile.PostedFile.FileName;
278             string srcFileName = Path.GetFileName(srcFile.ToString());          //原文件名
279             string srcFileExtension = Path.GetExtension(srcFile.ToString());    //原文件扩展名           
280             string strFileType = UpLoadFile.PostedFile.ContentType;             //获得文件类型
281             int strFileSize = UpLoadFile.PostedFile.ContentLength / _FileSizeMax;       //获得文件体积大小,单位KB
282   
283   
284             //限制文件上传大小
285             if (strFileSize > _FileSizeMax)
286             {
287                 _errMsg = "上传文件超过限制,文件大小限制为:" + _FileSizeMax + " KB";
288                 Response.Write("<script>alert('" + _errMsg + "')</script>");
289                 return;
290             }
291             if (!System.Text.RegularExpressions.Regex.IsMatch(srcFileExtension, _UploadDeniedExtensions, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
292             {
293                 _errMsg = "不允许上传此类型的文件";
294                 Response.Write("<script>alert('" + _errMsg + "')</script>");
295                 return;
296             }
297             strFileName = strFileName + srcFileExtension;                       //新文件名包括扩展名
298             _imagePath = _strNewFileFolder + strFileName;                       //返回上传后的图片路径
299   
300             //输出
301             _srcFileName = srcFileName;                 //上传文件原文件名
302             _srcFileExtension = srcFileExtension;       //扩展名
303             _strFileName = strFileName;                 //新文件名
304             _strFileType = strFileType;                 //文件类型
305             _strFileSize = strFileSize;                 //文件大小 单位 KB
306   
307             //判断是否为图片
308             bool IsImg = true;
309             if (UpLoadFile.PostedFile.ContentType.IndexOf("image") < 0)
310             {
311                 IsImg = false;
312             }
313   
314             if (IsImg == false)
315             {
316                 UpLoadFile.PostedFile.SaveAs(_strFileFolder + strFileName);          //非图片文件上传
317             }
318             else
319             {
320                 //加水印并上传
321                 if (_IsWatermark == true)
322                 {
323   
324                     System.Drawing.Image image;
325                     if (strFileType == "image/bmp") //bmp图片格式
326                         image = System.Drawing.Bitmap.FromStream(UpLoadFile.PostedFile.InputStream);
327                     else
328                         image = System.Drawing.Image.FromStream(UpLoadFile.PostedFile.InputStream);
329   
330                     System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);
331   
332                     if (_WatemarkType == "txt") //文字水印
333                     {
334   
335                         //将图片绘制到graphics中
336                         g.DrawImage(image, 0, 0, image.Width, image.Height);
337                         //设置文字的属性
338                         System.Drawing.Font f = new System.Drawing.Font(_WatemarkFont, _WatemarkFontSize, System.Drawing.GraphicsUnit.Pixel);
339   
340   
341                         //判断图片的大小,如果图片过小,不写文字
342                         if (image.Width < 200)
343                             //在此设定在图片上所加的文字
344                             _WatemarkText = "";
345   
346                         //写的文字的起始位置,x,y坐标
347                         _WatemarkPosX = 5;
348                         _WatemarkPosY = 5;
349                         //设置字体的颜色
350                         System.Drawing.Brush b = new System.Drawing.SolidBrush(System.Drawing.ColorTranslator.FromHtml(_WatemarkTextColor));
351   
352                         System.Drawing.StringFormat fm = new System.Drawing.StringFormat();
353   
354                         //水印放置左上角
355                         if (_WatemarkPos == 1)
356                         {
357                             fm.Alignment = System.Drawing.StringAlignment.Near;
358                             fm.LineAlignment = System.Drawing.StringAlignment.Near;
359                         }
360   
361                         //水平居中垂直顶部
362                         if (_WatemarkPos == 2)
363                         {
364                             fm.Alignment = System.Drawing.StringAlignment.Center;
365                             fm.LineAlignment = System.Drawing.StringAlignment.Near;
366                         }
367   
368                         //右上角
369                         if (_WatemarkPos == 3)
370                         {
371                             fm.Alignment = System.Drawing.StringAlignment.Far;
372                             fm.LineAlignment = System.Drawing.StringAlignment.Near;
373   
374                         }
375   
376                         //垂直居中水平靠左
377                         if (_WatemarkPos == 4)
378                         {
379                             fm.Alignment = System.Drawing.StringAlignment.Near;
380                             fm.LineAlignment = System.Drawing.StringAlignment.Center;
381                         }
382   
383                         //居中
384                         if (_WatemarkPos == 5)
385                         {
386                             fm.Alignment = System.Drawing.StringAlignment.Center;
387                             fm.LineAlignment = System.Drawing.StringAlignment.Center;
388                         }
389   
390                         //垂直居中水平靠右
391                         if (_WatemarkPos == 6)
392                         {
393                             fm.Alignment = System.Drawing.StringAlignment.Far;
394                             fm.LineAlignment = System.Drawing.StringAlignment.Center;
395                         }
396   
397                         //左下角
398                         if (_WatemarkPos == 7)
399                         {
400                             fm.Alignment = System.Drawing.StringAlignment.Near;
401                             fm.LineAlignment = System.Drawing.StringAlignment.Far;
402                         }
403   
404                         //水平居中垂直底部
405                         if (_WatemarkPos == 8)
406                         {
407                             fm.Alignment = System.Drawing.StringAlignment.Center;
408                             fm.LineAlignment = System.Drawing.StringAlignment.Far;
409                         }
410   
411                         //水印放置右下角
412                         if (_WatemarkPos == 9)
413                         {
414                             fm.Alignment = System.Drawing.StringAlignment.Far;
415                             fm.LineAlignment = System.Drawing.StringAlignment.Far;
416                         }
417   
418   
419                         //写字
420                         g.DrawString(_WatemarkText, f, b, new System.Drawing.RectangleF(0, 0, image.Width, image.Height), fm);
421   
422                         //释放graphics
423                         g.Dispose();
424   
425                         //保存加上水印的图片
426                         image.Save(_strFileFolder + strFileName);
427                         //释放image
428                         image.Dispose();
429   
430                     }
431                     else if (_WatemarkType == "img") //图片水印
432                     {
433   
434                         System.Drawing.Image copyImage = System.Drawing.Image.FromFile(_WatemarkImg);
435                         //水印放置左上角
436                         if (_WatemarkPos == 1)
437                         {
438                             _WatemarkPosX = 5;
439                             _WatemarkPosY = 5;
440                         }
441   
442                         //水平居中垂直顶部
443                         if (_WatemarkPos == 2)
444                         {
445                             _WatemarkPosX = (image.Width - copyImage.Width) / 2;
446                             _WatemarkPosY = 5;
447                         }
448   
449                         //右上角
450                         if (_WatemarkPos == 3)
451                         {
452                             _WatemarkPosX = image.Width - copyImage.Width - 5;
453                             _WatemarkPosY = 5;
454                         }
455   
456                         //垂直居中水平靠左
457                         if (_WatemarkPos == 4)
458                         {
459                             _WatemarkPosX = 5;
460                             _WatemarkPosY = (image.Height - copyImage.Height) / 2;
461                         }
462   
463                         //居中
464                         if (_WatemarkPos == 5)
465                         {
466                             _WatemarkPosX = (image.Width - copyImage.Width) / 2;
467                             _WatemarkPosY = (image.Height - copyImage.Height) / 2;
468                         }
469   
470                         //垂直居中水平靠右
471                         if (_WatemarkPos == 6)
472                         {
473                             _WatemarkPosX = image.Width - copyImage.Width - 5;
474                             _WatemarkPosY = (image.Height - copyImage.Height) / 2;
475                         }
476   
477                         //左下角
478                         if (_WatemarkPos == 7)
479                         {
480                             _WatemarkPosX = 5;
481                             _WatemarkPosY = image.Height - copyImage.Height - 5;
482                         }
483   
484                         //水平居中垂直底部
485                         if (_WatemarkPos == 8)
486                         {
487                             _WatemarkPosX = (image.Width - copyImage.Width) / 2;
488                             _WatemarkPosY = image.Height - copyImage.Height - 5;
489                         }
490   
491                         //水印放置右下角
492                         if (_WatemarkPos == 9)
493                         {
494                             _WatemarkPosX = image.Width - copyImage.Width - 5;
495                             _WatemarkPosY = image.Height - copyImage.Height - 5;
496                         }
497   
498                         if (copyImage.Height < image.Height && copyImage.Width < image.Width)
499                         {
500                             //将水印打印到上传图片上去
501                             g.DrawImage(copyImage, new System.Drawing.Rectangle(_WatemarkPosX, _WatemarkPosY, copyImage.Width, copyImage.Height), 0, 0, copyImage.Width, copyImage.Height, System.Drawing.GraphicsUnit.Pixel);
502                             //释放graphics
503                             g.Dispose();
504                         }
505                         //保存图片
506                         image.Save(_strFileFolder + strFileName);
507                         //释放image
508                         image.Dispose();
509                     }
510   
511                 }
512                 else
513                 {
514                     UpLoadFile.PostedFile.SaveAs(_strFileFolder + strFileName);          //不加水印上传
515                 }
516   
517                 //获得图片尺寸
518                 int OldFileHeight, OldFileWidth;
519                 System.Drawing.Image img = System.Drawing.Image.FromStream(UpLoadFile.PostedFile.InputStream);
520                 OldFileHeight = img.Height;
521                 OldFileWidth = img.Width;
522   
523                 //创建缩略图
524                 if (_IsThumb == true)
525                 {
526                     int NewImgHeight, NewImgWidth;
527   
528                     if (OldFileWidth > OldFileHeight)
529                     {
530                         NewImgWidth = _NewImgpx;
531                         NewImgHeight = (int)(OldFileHeight / (float)OldFileWidth * _NewImgpx);
532                     }
533                     else
534                     {
535                         NewImgHeight = _NewImgpx;
536                         NewImgWidth = (int)(OldFileWidth / (float)OldFileHeight * _NewImgpx);
537                     }
538                     //如果缩略图的尺寸大于原图尺寸,则用原图片大小
539                     if (NewImgHeight >= OldFileHeight && NewImgWidth >= OldFileWidth)
540                     {
541                         NewImgHeight = OldFileHeight;
542                         NewImgWidth = OldFileWidth;
543                     }
544                     System.Drawing.Image NewImg = img.GetThumbnailImage(NewImgWidth, NewImgHeight, null, System.IntPtr.Zero);
545                     NewImg.Save(_strFileFolder + "Thumb_" + strFileName, System.Drawing.Imaging.ImageFormat.Jpeg);
546   
547                     //返回数据
548                     _NewImgHeight = NewImgHeight;                 //缩略图高度
549                     _NewImgWidth = NewImgWidth;                  //缩略图宽度
550                     _thumbImgPath = _strNewFileFolder + "Thumb_" + strFileName;  //缩略图地址
551                 }
552                 //返回数据
553                 _OldFileWidth = OldFileWidth;    //原图宽度
554                 _OldFileHeight = OldFileHeight;  //原图高度
555   
556             }
557         }
558   
559         this.OnUpload(this, e);
560   
561     }
562 }

 具体使用方式:

更多内容参考 :http://dev.mjxy.cn/a-aspnet-Upload-file.aspx

posted @ 2011-07-16 16:34  敏捷学院  阅读(449)  评论(0编辑  收藏  举报