上传文件是网站常用的操作之一,最近也刚好要找一些关于上传控件的东东。搜了很多好东西也不少,不过不是没有详尽的说明就是都是英文而已。曾经想研究一下swfupload,可鼓捣了很久还是无果,只有放弃(如果您有幸看到此文章且对swfupload有所了解,请告诉我一下)。后来看了自带的FileUpload控件,找到了一些网上的相应操作类,于是乎改动了一些属性和方法完成了此文章。当然,后来看了一下Neatupload控件,也可以应用此类操作,差别不大。
主要功能:上传文件,添加水印
参考了http://www.cnblogs.com/wangergo/archive/2006/05/31/414239.html,其余部分来源未知
类文件如下
using
System;
using
System.Data;
using
System.Configuration;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
using
System.IO;
using
System.Drawing;
using
System.Drawing.Imaging;
using
System.Drawing.Drawing2D;

public
class
FilesUpload
...
{
public FilesUpload()
...{
//
// TODO: 在此处添加构造函数逻辑
//
}
//允许上传文件类型,"|"隔开
private string uploadFileExt = "gif|jpg|jpeg|png|bmp|doc|xls|hlp|chm|rar|zip";
//允许上传文件大小,字节 为单位,默认4M
private int uploadFileSize = 4 * 1024 * 1024;
//是否使用随机上传文件名
private bool isUseRandFileName = true;
//是否添加水印
private bool isAddWaterMark = true;
//添加水印类型(0为图片水印--默认,1为文字水印)
private int waterMarkMode = 0;
//图片水印地址
private string imageWaterMark = System.Web.HttpContext.Current.Server.MapPath("images/coal_logo.gif");
//图片/文字水印的水印位置(0为左上,1为右上,2为左下,3为右下--默认)
private int waterMarkPos = 3;
//默认图片水印透明度
private const float imageAlpha = 0.7f;
//图片水印的透明度
private float imageWaterMarkAlpha = imageAlpha;
//文字水印的添加文字
private string watermarkText = "hello the world !";

public string UploadFileExt
...{
get
...{
return uploadFileExt;
}
set
...{
uploadFileExt = value;
}
}
public int UploadFileSize
...{
get
...{
return uploadFileSize;
}
set
...{
uploadFileSize = value;
}
}
public bool IsUseRandFileName
...{
get
...{
return isUseRandFileName;
}
set
...{
isUseRandFileName = value;
}
}
public bool IsAddWaterMark
...{
get
...{
return isAddWaterMark;
}
set
...{
isAddWaterMark = value;
}
}
public int WaterMarkMode
...{
get
...{
return waterMarkMode;
}
set
...{
waterMarkMode = value;
}
}
public string ImageWaterMark
...{
get
...{
return imageWaterMark;
}
set
...{
imageWaterMark = System.Web.HttpContext.Current.Server.MapPath(value);
}
}
public int WaterMarkPos
...{
get
...{
return waterMarkPos;
}
set
...{
waterMarkPos = value;
}
}
public string WatermarkText
...{
get
...{
return watermarkText;
}
set
...{
watermarkText = value;
}
}
public float ImageWaterMarkAlpha
...{
get
...{
return imageWaterMarkAlpha;
}
set
...{
imageWaterMarkAlpha = value;
}
}

取得文件后缀#region 取得文件后缀
/**//// <summary>
/// 取得文件后缀
/// </summary>
/// <param name="filename">文件名称</param>
/// <returns></returns>
public string GetFileExtends(string filename)
...{
string ext = null;
if (filename.IndexOf('.') > 0)
...{
string[] fs = filename.Split('.');
ext = fs[fs.Length - 1];
}
return ext;
}
#endregion

检测文件是否合法#region 检测文件是否合法
/**//// <summary>
/// 检测上传文件是否合法
/// </summary>
/// <param name="fileExtends">文件后缀名</param>
/// <returns></returns>
public bool IsFileExtendsOk(string fileExtends)
...{
bool status = false;
string[] fe = this.uploadFileExt.Split(new char[] ...{ '|' });
fileExtends = fileExtends.ToLower();
for (int i = 0; i < fe.Length; i++)
...{
if (fe[i].ToLower() == fileExtends)
...{
status = true;
break;
}
}
return status;
}
#endregion

检测文件大小是否合法#region 检测文件大小是否合法
/**//// <summary>
/// 检测上传文件大小是否合法
/// </summary>
/// <param name="uploadControl">控件id</param>
/// <returns>true/false</returns>
private bool ISFileSizeOK(FileUpload uploadControl)
...{
long strLen = uploadControl.PostedFile.ContentLength;
long limiteSize = this.uploadFileSize;
//判断上传文件大小
if (strLen >= limiteSize)
...{
return false;
}
else
...{
return true;
}
}
#endregion

确保文件名的唯一性,以免覆盖#region 确保文件名的唯一性,以免覆盖
/**//// <summary>
/// 确保文件名的唯一性,以免覆盖
/// </summary>
/// <param name="filePath">上传路径</param>
/// <param name="fileName">文件名称</param>
/// <returns>处理后的文件名</returns>
public string BeSureOneFile(string filePath, string fileName)
...{
int i = 0;
string PathAndName = filePath + fileName;
//文件扩展名(含".")
string tempExt = Path.GetExtension(fileName);
while (File.Exists(PathAndName))
...{
i++;
//判断是否上传过同类重名文件,如abc(1).jpg,处理后则改名abc(2).jpg
if (PathAndName.LastIndexOf(")" + tempExt) >= 0)
...{
PathAndName = PathAndName.Remove(PathAndName.LastIndexOf('(')) + "(" + i + ")" + tempExt;
}
else
...{
PathAndName = PathAndName.Replace(tempExt, "(" + i + ")" + tempExt);
}
}
return PathAndName;
}
#endregion

重命名文件#region 重命名文件
/**//// <summary>
/// 重命名文件
/// </summary>
/// <param name="upOriFileName">原文件名</param>
/// <param name="upOriFileExt">原文件扩展名</param>
/// <returns>处理后的文件名</returns>
public string RenameFile(string upOriFileName, string upOriFileExt)
...{
string tempName = null;
if (this.isUseRandFileName)
...{
Random rd = new Random();
int tempR = rd.Next(1, 1000);
tempName = DateTime.Now.ToString("yyyyMMddHHmmss") + tempR + "." + upOriFileExt;
}
else
...{
tempName = upOriFileName;
}
return tempName;
}
#endregion


保存文件#region 保存文件
/**//// <summary>
/// 保存文件
/// </summary>
/// <param name="fpath">上传地址</param>
/// <param name="myFileUpload">上传控件</param>
/// <returns>处理结果</returns>
public string Upload(string fpath, FileUpload myFileUpload)
...{
string s = "";
string fileExtends = "";
string fileName = myFileUpload.FileName.Trim();
//判断是否选取上传文件或文件名为空
if (!string.IsNullOrEmpty(fileName))
...{
//取得文件后缀
fileExtends = this.GetFileExtends(fileName);
//判断文件类型是否合法
if (!this.IsFileExtendsOk(fileExtends))
...{
return "上传文件类型不合法!";
}
else
...{
//判断待传文件大小是否超出范围
if (!this.ISFileSizeOK(myFileUpload))
...{
return "上传的文件超过最大限度!";
}
else
...{
//重命名文件
s = RenameFile(fileName, fileExtends);
if (fpath.LastIndexOf(@"/") < 0 || fpath.LastIndexOf(@"") < 0)
...{
fpath = fpath + "/";
}
fpath = System.Web.HttpContext.Current.Server.MapPath(fpath);
//如上传目录为不存在,则创建目录
if (!Directory.Exists(fpath))
...{
Directory.CreateDirectory(fpath);
}
//最终经处理的文件处理路径及文件名
//string file = fpath + s;
//确保文件唯一性,以免错误覆盖
string file = BeSureOneFile(fpath, s);

try
...{
myFileUpload.SaveAs(file);
//添加水印
if (this.isAddWaterMark)
...{
this.addWaterMark(file, fpath, fileName, this.waterMarkMode);
}
return string.Format("文件{0}上传成功!", fileName);
}
catch (Exception ee)
...{
throw new Exception(ee.ToString());
}
}
}
}
else
...{
return "您没有选择待上传文件!";
}
return s;
}
#endregion

加入水印类型#region 加入水印类型
/**//// <summary>
/// 加入水印类型
/// </summary>
/// <param name="oldpath">原图片绝对地址(含图片名称)</param>
/// <param name="newpath">新图片放置的绝对地址(不含图片名)</param>
/// <param name="oldFileName">待加水印图片名</param>
/// <param name="markMode">水印方式(图片/文字)</param>
private void addWaterMark(string oldpath, string newpath, string oldFileName, int markMode)
...{
try
...{
//解决"该进程无法访问文件,因为该文件正由另一进程使用"
FileStream fs = new FileStream(oldpath, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
byte[] bytes = br.ReadBytes((int)fs.Length);
br.Close();
fs.Close();
MemoryStream ms = new MemoryStream(bytes);

System.Drawing.Image image = System.Drawing.Image.FromStream(ms);
Bitmap b = new Bitmap(image.Width, image.Height, PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(b);
g.Clear(Color.White);
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.High;
g.DrawImage(image, 0, 0, image.Width, image.Height);
switch (markMode)
...{
//是图片的话
case 0:
this.addWatermarkImage( g,this.imageWaterMark,this.waterMarkPos,image.Width,image.Height);
break;
//如果是文字
case 1:
this.addWatermarkText( g, this.watermarkText,this.waterMarkPos,image.Width,image.Height);
break;
}
//重命名文件
string waterMarkName = RenameFile(oldFileName, GetFileExtends(oldFileName));
//确保文件唯一性,以免错误覆盖
string waterMarkFile = BeSureOneFile(newpath, waterMarkName);
b.Save(waterMarkFile);
b.Dispose();
image.Dispose();
}
catch(Exception ee)
...{
throw new Exception(ee.ToString());
//if(File.Exists(oldpath))
//{
// File.Delete(oldpath);
//}
}
finally
...{
if(File.Exists(oldpath))
...{
File.Delete(oldpath);
}
}
}
#endregion

加入图片水印#region 加入图片水印
/**//// <summary>
/// 加入图片水印
/// </summary>
/// <param name="picture">imge 对象</param>
/// <param name="WaterMarkPicPath">水印图片的地址</param>
/// <param name="_watermarkPosition">水印位置</param>
/// <param name="_width">被加水印图片的宽</param>
/// <param name="_height">被加水印图片的高</param>
private void addWatermarkImage( Graphics picture,string WaterMarkPicPath,int _watermarkPosition,int _width,int _height)
...{
System.Drawing.Image watermark = new Bitmap(WaterMarkPicPath);
ImageAttributes imageAttributes = new ImageAttributes();
ColorMap colorMap = new ColorMap();
colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
ColorMap[] remapTable = ...{colorMap};
imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
//设置透明度,数值有误则取默认值
float tempAlpha;
if (this.imageWaterMarkAlpha >= 0 && this.imageWaterMarkAlpha <= 1)
...{
tempAlpha = this.imageWaterMarkAlpha;
}
else
...{
tempAlpha = imageAlpha;
}

float[][] colorMatrixElements = ...{
new float[] ...{1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
new float[] ...{0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
new float[] ...{0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
new float[] ...{0.0f, 0.0f, 0.0f, tempAlpha, 0.0f},
new float[] ...{0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
};
//矩阵说明:
// 从左至右对角线4个数字依次对应红色、绿色、蓝色、alpha
// 可按照需要自己设置,此处只对alpha进行全局设置
// 自己设置时,应0-1之间float

ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);
imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
int xpos = 0;
int ypos = 0;
int WatermarkWidth=0;
int WatermarkHeight=0;
double bl=1d;
//计算水印图片的比率
//取背景的1/4宽度来比较
if((_width>watermark.Width*4)&&(_height>watermark.Height*4))
...{
bl=1;
}
else if((_width>watermark.Width*4)&&(_height<watermark.Height*4))
...{
bl=Convert.ToDouble(_height/4)/Convert.ToDouble(watermark.Height);
}else
if((_width<watermark.Width*4)&&(_height>watermark.Height*4))
...{
bl=Convert.ToDouble(_width/4)/Convert.ToDouble(watermark.Width);
}
else
...{
if((_width*watermark.Height)>(_height*watermark.Width))
...{
bl=Convert.ToDouble(_height/4)/Convert.ToDouble(watermark.Height);
}
else
...{
bl=Convert.ToDouble(_width/4)/Convert.ToDouble(watermark.Width);
}
}
WatermarkWidth=Convert.ToInt32(watermark.Width*bl);
WatermarkHeight=Convert.ToInt32(watermark.Height*bl); 
switch(_watermarkPosition)
...{
case 0:
xpos = 10;
ypos = 10;
break;
case 1:
xpos = _width - WatermarkWidth - 10;
ypos = 10;
break;
case 2:
xpos = 10;
ypos = _height - WatermarkHeight - 10;
break;
case 3:
xpos = _width - WatermarkWidth - 10;
ypos = _height -WatermarkHeight - 10;
break;
}
picture.DrawImage(watermark, new Rectangle(xpos, ypos, WatermarkWidth, WatermarkHeight), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes);
watermark.Dispose();
imageAttributes.Dispose();
}
#endregion


加入文字水印#region 加入文字水印
/**//// <summary>
/// 加入文字水印
/// </summary>
/// <param name="picture">imge 对象</param>
/// <param name="_watermarkText">水印文字内容</param>
/// <param name="_watermarkPosition">水印位置</param>
/// <param name="_width">被加水印图片的宽</param>
/// <param name="_height">被加水印图片的高</param>
private void addWatermarkText(Graphics picture, string _watermarkText, int _watermarkPosition, int _width, int _height)
...{
int[] sizes = new int[]...{16,14,12,10,8,6,4};
Font crFont = null;
SizeF crSize = new SizeF();
for (int i=0 ;i<7; i++)
...{
crFont = new Font("arial", sizes[i], FontStyle.Bold);
crSize = picture.MeasureString(_watermarkText, crFont);
if((ushort)crSize.Width < (ushort)_width)
break;
}
float xpos = 0;
float ypos = 0;
switch(_watermarkPosition)
...{
case 0:
xpos = ((float)_width * (float).01) + (crSize.Width / 2);
ypos = (float)_height * (float).01;
break;
case 1:
xpos = ((float)_width * (float).99) - (crSize.Width / 2);
ypos = (float)_height * (float).01;
break;
case 2:
xpos = ((float)_width * (float).01) + (crSize.Width / 2);
ypos = ((float)_height * (float).99) - crSize.Height;
break;
case 3:
xpos = ((float)_width * (float).99) - (crSize.Width / 2);
ypos = ((float)_height * (float).99) - crSize.Height;
break;
}
StringFormat StrFormat = new StringFormat();
StrFormat.Alignment = StringAlignment.Center;
SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(153, 0, 0,0));
picture.DrawString(_watermarkText, crFont, semiTransBrush2, xpos+1, ypos+1, StrFormat);
SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(153, 255, 255, 255));
picture.DrawString(_watermarkText, crFont, semiTransBrush, xpos, ypos, StrFormat);

semiTransBrush2.Dispose();
semiTransBrush.Dispose();
}
#endregion
}
调用
protected
void
Button4_Click(
object
sender, EventArgs e)
...
{
//Label1.Text = FilesUpload.Upload(Server.MapPath("UploadFiles/"), FileUpload2);
FilesUpload upload = new FilesUpload();
upload.UploadFileExt = "jpg|gif"; // 允许上传文件格式,"|"分隔(默认gif|jpg|jpeg|png|bmp|doc|xls|hlp|chm|rar|zip)
upload.UploadFileSize = 1 * 1024 * 1024 ; // 允许上传文件大小,int型,单位字节(默认4M)
//upload.IsUseRandFileName = false; // 是否随机获取文件名(默认 true)
//upload.IsAddWaterMark = false; // 是否添加水印(默认 true)
//upload.WaterMarkMode = 1; // 水印类型,0为图片水印,1为文字水印(默认 0)
upload.ImageWaterMark = @"images/face/0.gif"; // 图片水印地址(相对路径)
upload.WaterMarkPos = 2; // 图片/文字水印的水印位置 0为左上,1为右上,2为左下,3为右下(默认 3)
upload.ImageWaterMarkAlpha = 0.5f; // 图片水印透明度,0-1的浮点型数字,不在此范围则取默认值(默认 0.7f)
//upload.WatermarkText = "www.xkxm.com!"; // 文字水印的添加文字(默认 hello the world !)
Label1.Text = upload.Upload("UploadFiles", FileUpload2);
}
再次声明,此类来源于网络,可实在是找不到出处了,我只是做了自己需要的修改,而且感觉也不够完善,以后会继续更新。
本文介绍了一个用于ASP.NET平台的文件上传组件,该组件支持上传文件、添加图片或文字水印,并具备文件类型与大小限制等功能。
975





