using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.SessionState;
namespace Test.Models
{
/// <summary>
/// PictureHandler 的摘要说明
/// </summary>
public class PictureHandler : IHttpHandler, IRequiresSessionState
{
/// <summary>
/// 文件类型
/// </summary>
public enum FileExtension
{
Jpg = 255216,
Gif = 7173,
Bmp = 6677,
Png = 13780,
Rar = 8297,
Exe = 7790,
Xml = 6063,
Html = 6033,
Aspx = 239187,
Cs = 117115,
Js = 119105,
Txt = 210187,
Sql = 255254
}
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
const string appUrl = "路径"; //需要保存的 服务器 文件夹路径
// CookieHelper.DelCookies("UploadPictureUrl");
int fileCount = 0;
string foldername = HttpUtility.UrlEncode(context.Request["Foldername"]); //传过来的文件夹名称
string date = DateTime.Now.ToString("yyyy") + "/" + DateTime.Now.ToString("MM") + "/" + DateTime.Now.ToString("dd") + "/";//增加日期
if (foldername == "") foldername = "UploadFile/Default/";
else foldername = "UploadFile" + HttpUtility.UrlDecode(foldername);
string newfoldername = foldername;
string rootUrl = AppDomain.CurrentDomain.BaseDirectory;
string saveUrl = "";
if (rootUrl.Contains("当前项目文件夹")) //在服务器上 当前项目为 www.xxxx.com
{
foldername = context.Server.MapPath(foldername + date).Replace("替换前文件夹名称", "替换后文件夹名称");
saveUrl = appUrl + newfoldername + date;
}
else
{
saveUrl = "/" + foldername + date;
foldername = AppDomain.CurrentDomain.BaseDirectory + foldername + date;
}
string url = "";
if (!Directory.Exists(foldername)) Directory.CreateDirectory(foldername);
System.Web.HttpFileCollection fileCollectioniles = context.Request.Files;
for (int i = 0; i < fileCollectioniles.Count; i++)
{
bool isSafe = IsSecureUploadPhoto(context.Request.Files[i]); //上传前检查图片
if (isSafe)
{
fileCount = fileCount + 1;
}
}
if (fileCount == fileCollectioniles.Count)
{
for (int i = 0; i < context.Request.Files.Count; i++)
{
//文件大小
long size = context.Request.Files[i].ContentLength;
//文件类型
string type = context.Request.Files[i].ContentType;
//文件名
string name = context.Request.Files[i].FileName;
//文件格式
string tp = System.IO.Path.GetExtension(name);
//获取文件流
System.IO.Stream stream = context.Request.Files[i].InputStream;
//保存文件
string saveName = DateTime.Now.ToString("yyyyMMddHHmmss") + i.ToString(CultureInfo.InvariantCulture) + tp;
string path = foldername + saveName;
context.Request.Files[i].SaveAs(path);
//生成缩略图
MakeThumbPic(path, path + "_50.jpg", 50, 50, "Cut");
MakeThumbPic(path, path + "_100.jpg", 100, 100, "Cut");
MakeThumbPic(path, path + "_150.jpg", 150, 150, "Cut");
MakeThumbPic(path, path + "_200.jpg", 400, 400, "Cut");
url = url + saveUrl + saveName + "|";
}
if (url != "")
{
string newUrl = HttpUtility.UrlEncode(url.Substring(0, url.Length - 1));
// CookieHelper.AddCookies("UploadPictureUrl", newUrl);
}
}
}
/// <summary>
/// 生成缩略图
/// </summary>
/// <param name="originalImagePath">源图路径(物理路径)</param>
/// <param name="thumbnailPath">缩略图路径(物理路径)</param>
/// <param name="width">缩略图宽度</param>
/// <param name="height">缩略图高度</param>
/// <param name="mode">生成缩略图的方式</param>
public static void MakeThumbPic(string originalImagePath, string thumbnailPath, int width, int height, string mode)
{
Image originalImage = Image.FromFile(originalImagePath);
int towidth = width;
int toheight = height;
int x = 0;
int y = 0;
int ow = originalImage.Width;
int oh = originalImage.Height;
switch (mode)
{
case "HW"://指定高宽缩放(可能变形)
break;
case "W"://指定宽,高按比例
toheight = originalImage.Height * width / originalImage.Width;
break;
case "H"://指定高,宽按比例
towidth = originalImage.Width * height / originalImage.Height;
break;
case "Cut"://指定高宽裁减
if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
{
oh = originalImage.Height;
ow = originalImage.Height * towidth / toheight;
y = 0;
x = (originalImage.Width - ow) / 2;
}
else
{
ow = originalImage.Width;
oh = originalImage.Width * height / towidth;
x = 0;
y = (originalImage.Height - oh) / 2;
}
break;
case "CutA"://指定高宽裁减(不变形)自定义
if (ow <= towidth && oh <= toheight)
{
x = -(towidth - ow) / 2;
y = -(toheight - oh) / 2;
ow = towidth;
oh = toheight;
}
else
{
if (ow > oh)//宽大于高
{
x = 0;
y = -(ow - oh) / 2;
oh = ow;
}
else//高大于宽
{
y = 0;
x = -(oh - ow) / 2;
ow = oh;
}
}
break;
default:
break;
}
//新建一个bmp图片
Image bitmap = new System.Drawing.Bitmap(towidth, toheight);
//新建一个画板
Graphics g = System.Drawing.Graphics.FromImage(bitmap);
//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//清空画布并以白色背景色填充
g.Clear(Color.White);
//在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
new Rectangle(x, y, ow, oh),
GraphicsUnit.Pixel);
try
{
//以jpg格式保存缩略图
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Png);
}
catch (System.Exception e)
{
throw e;
}
finally
{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
}
/// <summary>
///图片检测类 是否允许
/// </summary>
public static bool IsAllowedExtension(HttpPostedFile oFile, FileExtension[] fileEx)
{
int fileLen = oFile.ContentLength;
var imgArray = new byte[fileLen];
oFile.InputStream.Read(imgArray, 0, fileLen);
var ms = new MemoryStream(imgArray);
var br = new System.IO.BinaryReader(ms);
string fileclass = "";
try
{
byte buffer = br.ReadByte();
fileclass = buffer.ToString(CultureInfo.InvariantCulture);
buffer = br.ReadByte();
fileclass += buffer.ToString(CultureInfo.InvariantCulture);
}
catch
{
}
br.Close();
ms.Close();
foreach (FileExtension fe in fileEx)
{
if (Int32.Parse(fileclass) == (int)fe) return true;
}
return false;
}
/// <summary>
/// 上传前检查图片是不是安全
/// </summary>
public static bool IsSecureUploadPhoto(HttpPostedFile oFile)
{
bool isPhoto = false;
string fileExtension = System.IO.Path.GetExtension(oFile.FileName).ToLower();
string[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg", ".bmp" };
for (int i = 0; i < allowedExtensions.Length; i++)
{
if (fileExtension == allowedExtensions[i])
{
isPhoto = true;
break;
}
}
if (!isPhoto)
{
return false;
}
FileExtension[] fe = { FileExtension.Bmp, FileExtension.Gif, FileExtension.Jpg, FileExtension.Png };
if (IsAllowedExtension(oFile, fe)) return true;
else return false;
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.SessionState;
namespace Test.Models
{
/// <summary>
/// PictureHandler 的摘要说明
/// </summary>
public class PictureHandler : IHttpHandler, IRequiresSessionState
{
/// <summary>
/// 文件类型
/// </summary>
public enum FileExtension
{
Jpg = 255216,
Gif = 7173,
Bmp = 6677,
Png = 13780,
Rar = 8297,
Exe = 7790,
Xml = 6063,
Html = 6033,
Aspx = 239187,
Cs = 117115,
Js = 119105,
Txt = 210187,
Sql = 255254
}
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
const string appUrl = "路径"; //需要保存的 服务器 文件夹路径
// CookieHelper.DelCookies("UploadPictureUrl");
int fileCount = 0;
string foldername = HttpUtility.UrlEncode(context.Request["Foldername"]); //传过来的文件夹名称
string date = DateTime.Now.ToString("yyyy") + "/" + DateTime.Now.ToString("MM") + "/" + DateTime.Now.ToString("dd") + "/";//增加日期
if (foldername == "") foldername = "UploadFile/Default/";
else foldername = "UploadFile" + HttpUtility.UrlDecode(foldername);
string newfoldername = foldername;
string rootUrl = AppDomain.CurrentDomain.BaseDirectory;
string saveUrl = "";
if (rootUrl.Contains("当前项目文件夹")) //在服务器上 当前项目为 www.xxxx.com
{
foldername = context.Server.MapPath(foldername + date).Replace("替换前文件夹名称", "替换后文件夹名称");
saveUrl = appUrl + newfoldername + date;
}
else
{
saveUrl = "/" + foldername + date;
foldername = AppDomain.CurrentDomain.BaseDirectory + foldername + date;
}
string url = "";
if (!Directory.Exists(foldername)) Directory.CreateDirectory(foldername);
System.Web.HttpFileCollection fileCollectioniles = context.Request.Files;
for (int i = 0; i < fileCollectioniles.Count; i++)
{
bool isSafe = IsSecureUploadPhoto(context.Request.Files[i]); //上传前检查图片
if (isSafe)
{
fileCount = fileCount + 1;
}
}
if (fileCount == fileCollectioniles.Count)
{
for (int i = 0; i < context.Request.Files.Count; i++)
{
//文件大小
long size = context.Request.Files[i].ContentLength;
//文件类型
string type = context.Request.Files[i].ContentType;
//文件名
string name = context.Request.Files[i].FileName;
//文件格式
string tp = System.IO.Path.GetExtension(name);
//获取文件流
System.IO.Stream stream = context.Request.Files[i].InputStream;
//保存文件
string saveName = DateTime.Now.ToString("yyyyMMddHHmmss") + i.ToString(CultureInfo.InvariantCulture) + tp;
string path = foldername + saveName;
context.Request.Files[i].SaveAs(path);
//生成缩略图
MakeThumbPic(path, path + "_50.jpg", 50, 50, "Cut");
MakeThumbPic(path, path + "_100.jpg", 100, 100, "Cut");
MakeThumbPic(path, path + "_150.jpg", 150, 150, "Cut");
MakeThumbPic(path, path + "_200.jpg", 400, 400, "Cut");
url = url + saveUrl + saveName + "|";
}
if (url != "")
{
string newUrl = HttpUtility.UrlEncode(url.Substring(0, url.Length - 1));
// CookieHelper.AddCookies("UploadPictureUrl", newUrl);
}
}
}
/// <summary>
/// 生成缩略图
/// </summary>
/// <param name="originalImagePath">源图路径(物理路径)</param>
/// <param name="thumbnailPath">缩略图路径(物理路径)</param>
/// <param name="width">缩略图宽度</param>
/// <param name="height">缩略图高度</param>
/// <param name="mode">生成缩略图的方式</param>
public static void MakeThumbPic(string originalImagePath, string thumbnailPath, int width, int height, string mode)
{
Image originalImage = Image.FromFile(originalImagePath);
int towidth = width;
int toheight = height;
int x = 0;
int y = 0;
int ow = originalImage.Width;
int oh = originalImage.Height;
switch (mode)
{
case "HW"://指定高宽缩放(可能变形)
break;
case "W"://指定宽,高按比例
toheight = originalImage.Height * width / originalImage.Width;
break;
case "H"://指定高,宽按比例
towidth = originalImage.Width * height / originalImage.Height;
break;
case "Cut"://指定高宽裁减
if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
{
oh = originalImage.Height;
ow = originalImage.Height * towidth / toheight;
y = 0;
x = (originalImage.Width - ow) / 2;
}
else
{
ow = originalImage.Width;
oh = originalImage.Width * height / towidth;
x = 0;
y = (originalImage.Height - oh) / 2;
}
break;
case "CutA"://指定高宽裁减(不变形)自定义
if (ow <= towidth && oh <= toheight)
{
x = -(towidth - ow) / 2;
y = -(toheight - oh) / 2;
ow = towidth;
oh = toheight;
}
else
{
if (ow > oh)//宽大于高
{
x = 0;
y = -(ow - oh) / 2;
oh = ow;
}
else//高大于宽
{
y = 0;
x = -(oh - ow) / 2;
ow = oh;
}
}
break;
default:
break;
}
//新建一个bmp图片
Image bitmap = new System.Drawing.Bitmap(towidth, toheight);
//新建一个画板
Graphics g = System.Drawing.Graphics.FromImage(bitmap);
//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//清空画布并以白色背景色填充
g.Clear(Color.White);
//在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
new Rectangle(x, y, ow, oh),
GraphicsUnit.Pixel);
try
{
//以jpg格式保存缩略图
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Png);
}
catch (System.Exception e)
{
throw e;
}
finally
{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
}
/// <summary>
///图片检测类 是否允许
/// </summary>
public static bool IsAllowedExtension(HttpPostedFile oFile, FileExtension[] fileEx)
{
int fileLen = oFile.ContentLength;
var imgArray = new byte[fileLen];
oFile.InputStream.Read(imgArray, 0, fileLen);
var ms = new MemoryStream(imgArray);
var br = new System.IO.BinaryReader(ms);
string fileclass = "";
try
{
byte buffer = br.ReadByte();
fileclass = buffer.ToString(CultureInfo.InvariantCulture);
buffer = br.ReadByte();
fileclass += buffer.ToString(CultureInfo.InvariantCulture);
}
catch
{
}
br.Close();
ms.Close();
foreach (FileExtension fe in fileEx)
{
if (Int32.Parse(fileclass) == (int)fe) return true;
}
return false;
}
/// <summary>
/// 上传前检查图片是不是安全
/// </summary>
public static bool IsSecureUploadPhoto(HttpPostedFile oFile)
{
bool isPhoto = false;
string fileExtension = System.IO.Path.GetExtension(oFile.FileName).ToLower();
string[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg", ".bmp" };
for (int i = 0; i < allowedExtensions.Length; i++)
{
if (fileExtension == allowedExtensions[i])
{
isPhoto = true;
break;
}
}
if (!isPhoto)
{
return false;
}
FileExtension[] fe = { FileExtension.Bmp, FileExtension.Gif, FileExtension.Jpg, FileExtension.Png };
if (IsAllowedExtension(oFile, fe)) return true;
else return false;
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
注:以上代码为 一般处理程序 完整代码