C#.Net 上传图片,限制图片大小,检查类型完整版
源代码:
处理图片类,如检查图片大小,按宽度比例缩小图片
public
class
CImageLibrary
{
public
enum
ValidateImageResult { OK, InvalidFileSize, InvalidImageSize }
public
static
ValidateImageResult ValidateImage(
string
file,
int
MAX_FILE_SIZE,
int
MAX_WIDTH,
intMAX_HEIGHT)
{
byte[] bs = File.ReadAllBytes(file);
double
size = (bs.Length / 1024);
if
(size > MAX_FILE_SIZE)
return
ValidateImageResult.InvalidFileSize;
Image img = Image.FromFile(file);
if
(img.Width > MAX_WIDTH || img.Height > MAX_HEIGHT)
returnValidateImageResult.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;
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; }
}
}
上传文件自定义类. 业务逻辑全部在CFileUpload类!
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;
public
CFileUpload(FileUpload fileUpload,
string
savePath,
bool
autoGenFileName)
{
_savePath = savePath;
_fileUpload = fileUpload;
_AutoGenFileName = autoGenFileName;
}
public
CFileUpload(FileUpload fileUpload,
string
savePath)
{
_savePath = savePath;
_fileUpload = fileUpload;
}
public
bool
UploadRARFile()
{
return
DoUpload(ZIP_FILE);
}
public
bool
UploadVideo()
{
return
DoUpload(MUILT_MEDIA_FILE);
}
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);
}
public
bool
UploadAnySupported()
{
return
DoUpload(PICTURE_FILE + ZIP_FILE + MUILT_MEDIA_FILE);
}
private
string
GetNewFileName(
string
folder,
string
fileName)
{
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;
}
}
private
bool
AllowMaxSize(
int
fileLength)
{
int
MAX_SIZE_UPLOAD = 1024;
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;
}
}
使用说明:
页面的Button.Click事件
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 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);
}
}