kindeditor自動生成縮略圖


自從注冊了博客園的賬號,開通了博客,很久沒有寫點什么東西了,一是自己也是一個新手,掌握的東西還很少,二是最近的項目真的很多,忙的昏天暗地的。

最近剛做完一個項目,用的是kindedtor編輯器,確實很好用,但是也有很多的不足,比如,我們經常用的圖片上傳功能,首頁如果有圖片新聞或者需要顯示宿略圖的時候,你會發現它並沒有提供圖片上傳自動生成縮略圖的功能,於是,花了一點時間,對它的上傳圖片的功能進行了改寫,廢話少說,直接上代碼:

圖片上傳功能調用的是:upload_json.ashx

using System;
using System.Collections;
using System.Web;
using System.IO;
using System.Globalization;
using LitJson;

public class Upload : IHttpHandler
{
private HttpContext context;

public void ProcessRequest(HttpContext context)
{
//獲得文件名
String aspxUrl = context.Request.Path.Substring(0, context.Request.Path.LastIndexOf("/") + 1);
//文件保存目錄路徑
String savePath = "../attached/";
//文件保存目錄URL
String saveUrl = aspxUrl + "../attached/";
//定義允許上傳的文件擴展名
Hashtable extTable = new Hashtable();
extTable.Add("image", "gif,jpg,jpeg,png,bmp");
extTable.Add("flash", "swf,flv");
extTable.Add("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
extTable.Add("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");

//最大文件大小
int maxSize = 52428800;
this.context = context;
//獲取文件
HttpPostedFile imgFile = context.Request.Files["imgFile"];
if (imgFile == null)
{
showError("請選擇文件。");
}

String dirPath = context.Server.MapPath(savePath);
if (!Directory.Exists(dirPath))
{
showError("上傳目錄不存在。");
}
//獲取文件類型
String dirName = context.Request.QueryString["dir"];
if (String.IsNullOrEmpty(dirName)) {
dirName = "image";
}

if (!extTable.ContainsKey(dirName)) {
showError("目錄名不正確。");
}

String fileName = imgFile.FileName;
String fileExt = Path.GetExtension(fileName).ToLower();

if (imgFile.InputStream == null || imgFile.InputStream.Length > maxSize)
{
showError("上傳文件大小超過限制。");
}

if (String.IsNullOrEmpty(fileExt) || Array.IndexOf(((String)extTable[dirName]).Split(','), fileExt.Substring(1).ToLower()) == -1)
{
showError("上傳文件擴展名是不允許的擴展名。\n只允許" + ((String)extTable[dirName]) + "格式。");
}

//創建文件夾
dirPath += dirName + "/";
saveUrl += dirName + "/";
if (!Directory.Exists(dirPath)) {
Directory.CreateDirectory(dirPath);
}
String ymd = DateTime.Now.ToString("yyyyMMdd", DateTimeFormatInfo.InvariantInfo);
dirPath += ymd + "/";
saveUrl += ymd + "/";
if (!Directory.Exists(dirPath)) {
Directory.CreateDirectory(dirPath);
}
//生成文件名
String newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
//文件保存的物理里地址
String filePath = dirPath + newFileName;
//保存文件
imgFile.SaveAs(filePath);
//文件相對地址
String fileUrl = saveUrl + newFileName;
//設置返回信息,返回值是以JSON數組形式返回的,即前面是key,后面是value
Hashtable hash = new Hashtable();
hash["error"] = 0;
//返回原圖的地址
hash["url"] = fileUrl;
/*
還可設置多個返回結果,比如圖片的寬,高等
如:hash["width"]=100;
*/
//判斷上傳的文件類型
if (context.Request.QueryString["dir"] == "image")
{
//請求中有width這個參數表示圖片需要進行處理
if (context.Request.QueryString["width"] != null)
{ //縮略圖相對地址
string thumbfilePath = dirPath + "Thumb" + newFileName;
int width=Convert.ToInt32(context.Request.QueryString["width"]);
int height=Convert.ToInt32(context.Request.QueryString["height"]);
//獲得原始圖片的寬和高
System.Drawing.Image originalImage = System.Drawing.Image.FromFile(filePath);
int ow = originalImage.Width;
int oh = originalImage.Height;
//如果原圖的尺寸比縮略圖要求的尺寸小,則不進行任何處理
if (width <= ow && height <= oh)
{
string smillUrl = fileUrl;
//返回縮略圖的地址
hash["thumUrl"] = smillUrl;
}
else
{
//生成縮略圖
if (MakeThumbnail(filePath, thumbfilePath, width, height, "HW"))
{
string smillUrl = saveUrl + "Thumb" + newFileName;
hash["thumUrl"] = smillUrl;
}
else
{
showError("生成縮略圖失敗");
}
}
}
}
context.Response.AddHeader("Content-Type", "text/html; charset=UTF-8");
context.Response.Write(JsonMapper.ToJson(hash));
context.Response.End();
}
//返回錯誤消息
private void showError(string message)
{
Hashtable hash = new Hashtable();
hash["error"] = 1;
hash["message"] = message;
context.Response.AddHeader("Content-Type", "text/html; charset=UTF-8");
context.Response.Write(JsonMapper.ToJson(hash));
context.Response.End();
}

public bool IsReusable
{
get
{
return true;
}
}
/// <summary>
/// 生成縮略圖
/// </summary>
/// <param name="originalImagePath">源圖路徑(物理路徑)</param>
/// <param name="thumbnailPath">縮略圖路徑(物理路徑)</param>
/// <param name="width">縮略圖寬度</param>
/// <param name="height">縮略圖高度</param>
/// <param name="mode">生成縮略圖的方式</param>
public static bool MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
{
System.Drawing.Image originalImage = System.Drawing.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;
default:
break;
}

//新建一個bmp圖片
System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);

//新建一個畫板
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);

//設置高質量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

//設置高質量,低速度呈現平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

//清空畫布並以透明背景色填充
g.Clear(System.Drawing.Color.Transparent);

//在指定位置並且按指定大小繪制原圖片的指定部分
g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight),
new System.Drawing.Rectangle(x, y, ow, oh),
System.Drawing.GraphicsUnit.Pixel);

try
{
//以jpg格式保存縮略圖
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
return true;
}
catch (System.Exception e)
{
return false;
throw e;

}
finally
{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
}
}

前台調用就很簡單了,這里也貼一下:

KindEditor.ready(function (K) {
var uploadbutton = K.uploadbutton({
button: K('#uploadButton')[0],
//上傳的文件類型
fieldName: 'imgFile',
//注意后面的參數,dir表示文件類型,width表示縮略圖的寬,height表示高
url: '../Editer/asp.net/upload_json.ashx?dir=image&width=65&height=61',
afterUpload: function (data) {
if (data.error === 0) {
alert('圖片上傳成功');
//取返回值,注意后台設置的key,如果要取原值
//取縮略圖地址
var thumUrl = K.formatUrl(data.thumUrl, 'absolute');
//取原圖地址
//var url=k.fromUrl(data.Url,'absolute');
K('#txtPic').val(thumUrl);
} else {
alert(data.message);
}
},
afterError: function (str) {
alert('自定義錯誤信息: ' + str);
}
});
uploadbutton.fileBox.change(function (e) {
uploadbutton.submit();
});
});

基本用法就是這樣當然還可以加水印,什么的,很簡單,如果大家有疑問或者其他的需要,跟帖告訴我,我會根據大家的需求寫一個完整的處理程序。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM