上传文件是网站常用的操作之一,最近也刚好要找一些关于上传控件的东东。搜了很多好东西也不少,不过不是没有详尽的说明就是都是英文而已。曾经想研究一下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);
}
再次声明,此类来源于网络,可实在是找不到出处了,我只是做了自己需要的修改,而且感觉也不够完善,以后会继续更新。