/**
#为什么没有上传附件的地方啊?有的话告诉我? 可以把DEMO程序直接上传
*/
//--------------------下面是代码,只要创建Generic Handler(.ashx)以后 把这些代码粘贴就可以用--------
using System;
using System.Collections;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using System.IO;
using System.Text;
/**
* 功能:KindEditor的Image Plugins服务器端代码(C#,.Net3.5)
*
* 使用:image.html里面的 <form name="uploadForm" method="post" enctype="multipart/form-data" action="{写该服务的地址}">
*
* 作者:HWG(XXJ) QQ:250233984
*
* 日期:2009年12月15日
*
* 版本:1.0测试版
*
* 声明:使用该代码的时请带版权信息!
*
*/
namespace KindEditor.Service
{
static class HttpPostedFileExtensions
{
/// <summary>
/// 要上传的图片的相对路径 *必须从根(/)开始写 *项目中请先创建该目录
/// </summary>
public const string IMAGE_UPLOAD_PATH = "/ImageStore";
/// <summary>
/// 支持的图片类型
/// </summary>
private static string[] IMAGE_TYPE = new string[] { ".gif", ".jpg", ".jpeg", ".png", ".bmp" };
/// <summary>
/// 支持的图片的最大容量
/// </summary>
private static int IMAGE_MAX_LENGHT = 1 * 1024 * 1024; //1MB
/// <summary>
/// 服务器端图片名字前缀
/// </summary>
private const string IMAGE_START_NAME = "IS";
/// <summary>
/// 检查客户端传过来的文件是不是合法的图片
/// </summary>
/// <param name="file"></param>
/// <param name="resultMessage"></param>
/// <returns></returns>
public static bool CheckImageFile(this HttpPostedFile file, out string resultMessage)
{
//Check Content Type
string imageType = file.ContentType;
if (imageType == null || !imageType.Trim().StartsWith("image"))
{
resultMessage = "不是图片类型,请选择正确的图片!";
return false;
}
//Check Image File Extension
string fileExtension = System.IO.Path.GetExtension(file.FileName);
if (string.IsNullOrEmpty(fileExtension) || !IMAGE_TYPE.Contains<string>(fileExtension.Trim().ToLower()))
{
resultMessage = "不是图片类型,请选择正确的图片!";
return false;
}
//Check Image File Lenght
if (file.InputStream == null || file.InputStream.Length > IMAGE_MAX_LENGHT)
{
resultMessage = "图片大小不合法,请选择正确的图片!";
return false;
}
resultMessage = string.Empty;
return true;
}
/// <summary>
/// 获取保存图片的路径和图片的新名字
/// </summary>
/// <param name="file"></param>
/// <param name="currentContext"></param>
/// <param name="filePath"></param>
/// <param name="fileName"></param>
/// <param name="resultMessage"></param>
/// <returns></returns>
public static bool GetPathAndName(this HttpPostedFile file, HttpContext currentContext, out string filePath, out string fileName, out string resultMessage)
{
resultMessage = string.Empty;
fileName = string.Empty;
filePath = currentContext.Server.MapPath(IMAGE_UPLOAD_PATH);
if (string.IsNullOrEmpty(filePath) || !Directory.Exists(filePath))
{
resultMessage = "项目中不存在该虚拟路径,请重新配置!";
return false;
}
string fileExtension = System.IO.Path.GetExtension(file.FileName);
//格式: 图片名前缀_Year-Month-Day_Hour-Minute-Second_RandomNum.FileExtension
do
{
fileName = string.Format("{0}_{1}_{2}{3}", IMAGE_START_NAME, DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"), _getRandomNum(), fileExtension);
}
while (File.Exists(System.IO.Path.Combine(filePath, fileName)));
return true;
}
/// <summary>
/// 生成随机数
/// </summary>
/// <returns></returns>
public static string _getRandomNum()
{
Random seed = new Random();
Random randomNum = new Random(seed.Next());
return randomNum.Next().ToString();
}
}
public class ImageInfo
{
public string Id { get; set; }
public string Type { get; set; }
public string Url { get; set; }
public string ImgTitle { get; set; }
public string ImgHeight { get; set; }
public string ImgBorder { get; set; }
public string ImgWidth { get; set; }
}
/// <summary>
/// Summary description for $codebehindclassname$
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Upload : IHttpHandler
{
private static string _cacheAlertString = string.Empty;
private static string _cacheCallbackHtml = string.Empty;
private static string _chcheHostUrl = string.Empty;
public void ProcessRequest(HttpContext context)
{
HttpPostedFile file = context.Request.Files["imgFile"];
if (file == null)
{
context.Response.Write(_getAlertStr("请选择图片!"));
return;
}
string resultMessage;
if (!file.CheckImageFile(out resultMessage))
{
context.Response.Write(_getAlertStr(resultMessage));
return;
}
string fileName;
string filePath;
if (!file.GetPathAndName(context, out filePath, out fileName, out resultMessage))
{
context.Response.Write(_getAlertStr(resultMessage));
return;
}
try
{
file.SaveAs(System.IO.Path.Combine(filePath, fileName));
}
catch (Exception ex)
{
//Log...
context.Response.Write(_getAlertStr("图片上传失败,请重试或跟管理员联系!"));
return;
}
//--------------------Do callback--------------------
ImageInfo info = new ImageInfo();
info.Id = context.Request.Form.Get("id");
info.ImgBorder = context.Request.Form.Get("imgBorder");
info.ImgHeight = context.Request.Form.Get("imgHeight");
info.ImgTitle = context.Request.Form.Get("imgTitle");
info.ImgWidth = context.Request.Form.Get("imgWidth");
/* 带HostUrl的方式
if(string.IsNullOrEmpty(_chcheHostUrl))
{
lock(_chcheHostUrl)
{
if(string.IsNullOrEmpty(_chcheHostUrl))
{
string currentPath = context.Request.RawUrl.ToString();
string currentUrl = context.Request.Url.ToString();
string hostPath = currentUrl.Substring(0, currentUrl.LastIndexOf(currentPath));
_chcheHostUrl = hostPath;
}
}
}
info.Url = string.Format("{0}{1}/{2}", _chcheHostUrl, HttpPostedFileExtensions.IMAGE_UPLOAD_PATH, fileName);
*/
//不带HostUrl
info.Url = string.Format("{0}/{1}", HttpPostedFileExtensions.IMAGE_UPLOAD_PATH, fileName);
context.Response.Write(_getCallbackHtml(info));
}
/// <summary>
/// 生成客户端提示信息
/// </summary>
/// <param name="meg"></param>
/// <returns></returns>
private static string _getAlertStr(string meg)
{
if (string.IsNullOrEmpty(_cacheAlertString))
{
lock (_cacheAlertString)
{
if (string.IsNullOrEmpty(_cacheAlertString))
{
StringBuilder sb = new StringBuilder();
sb.Append("<html>");
sb.Append("<head>");
sb.Append("<title>error</title>");
sb.Append("<meta http-equiv='content-type' content='text/html; charset=utf-8'>");
sb.Append("</head>");
sb.Append("<body>");
sb.Append("<html>");
sb.Append("<script type='text/javascript'>alert('@MSG@');history.back();</script>");
sb.Append("</body>");
sb.Append("</html>");
_cacheAlertString = sb.ToString();
}
}
}
return _cacheAlertString.Replace("@MSG@", meg);
}
/// <summary>
/// 获取回调的HTML
/// </summary>
/// <returns></returns>
private static string _getCallbackHtml(ImageInfo imageInfo)
{
if (string.IsNullOrEmpty(_cacheCallbackHtml))
{
lock (_cacheCallbackHtml)
{
if (string.IsNullOrEmpty(_cacheCallbackHtml))
{
StringBuilder sb = new StringBuilder();
sb.Append("<html>");
sb.Append("<head>");
sb.Append("<title>Insert Image</title>");
sb.Append("<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">");
sb.Append("</head>");
sb.Append("<body>");
sb.Append("@SCRIPT@");
sb.Append("</body>");
sb.Append("</html>");
_cacheCallbackHtml = sb.ToString();
}
}
}
string script = "<script type=\"text/javascript\">parent.KE.plugin[\"image\"].insert('" + imageInfo.Id + "', '" + imageInfo.Url + "','" + imageInfo.ImgTitle + "','" + imageInfo.ImgWidth + "','" + imageInfo.ImgHeight + "','" + imageInfo.ImgBorder + "');</script>";
return _cacheCallbackHtml.Replace("@SCRIPT@", script);
}
public bool IsReusable
{
get
{
return true;
}
}
}
}