asp.net中使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();
});
});

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

更多相關文章
  • 在nginx中利用image_filter動態生成縮略圖我還是頭一次使用了,開始不知道怎麽用,後來找到了一個例子,下面給各位朋友看看這個例子吧.先來看一下什麽是nginx的image filter模塊.HttpIma
  • 本文章提供關于aspjpeg圖像組件的實例方法,主要有 給圖片加圖片水印 給圖片加文字水印 生成圖片的縮略圖'函數名:watermarkfont'作 用:給圖片加文字水印'參 數:imgurl 原圖地址' fontc
  • 本文章来给大家推荐一篇关于CentOS安装nginx+lua_nginx+GraphicsMagick生成实时缩略图实例,如果你有需要可尝试进入参考安装.下载:软件下载地址:http://soft.ileiming.
  • CKEditor是現在大多數據站長常用的一個網頁編輯器了,以前我們常介紹CKEditor如何在php中使用,下面我來給大家介紹asp.net中配置與使用CKEditor編輯器圖例,大家可進入參考.1.官方網站(htt
  • 文章介紹了在php生成一個透明背景的png縮略圖程序,在php要中處理這個很簡單我們只要用到imagealphablending($thumb,false);與imagesavealpha($thumb,true);
  • 縮略圖如果是圖片我們直接使用php gD庫就可實現了,本文章要介紹的是Imagick把pdf生成png縮略圖方法,這裏我們要利用一個插件了,下面我來給大家演示一個實例.php_imagick什麽一個可以供PHP調用ImageMagick功能的PHP擴展.使用這個擴展可以使PHP具備和ImageMag
  • 需要安裝imagick及其php擴展.一共有二個函數,都是從網上摘下來的,還沒測試,這個方案應該可行,可以簡單的仿照線上文檔功能,有機會在專案中實踐一下第一種 代碼如下 /*** PDF2PNG * @param $
  • 解決asp.net中CF 3.5 Bitmap(Stream)未處理異常問題
    本文章介紹了關于解決asp.net中CF 3.5 Bitmap(Stream)未處理異常問題 ,有在開發window mb的朋友如果碰到此類問題可以參考一下本文章哦.VS2008開發環境,在進行.NET CF 3.5下的WM Socket編程時Bitmap bmp = new Bitmap(Stre ...
一周排行
  • 回應式網頁設計出現以來,更多是使用百分比布自適應布局,特別是在移動端,兩端對齊的方式顯得越來越重要.那麽,如何使用CSS實現兩端對齊,相信很多同學會文本對齊的text-align:justify,這是今天要講的其中一 ...
  • 在sqlserver中substring函數是用來處理字符串的,常用于字符串截取了,下面我來給大家介紹幾個我學習sqlserver substring函數一些筆記哦.SUBSTRING1.語法SUBSTRING ( ...
  • python stock數據包tushare例子
    文章爲各位介紹一個開源的免費的python stock數據包tushare例子,希望例子對
  • Beamer  使用 tikz 宏包實現畫圖和動畫實例
    無意之中搜索到tikz這個宏包,它可以在beamer中用來繪制圖表,還可以結合到beame
  • 本文我們講講Android開發中比較高級的內容,應用程序組成部分,Manifest文件,Manifest文件節點,在Android平台的應用程序開發過程中,Manifest文件舉足輕重.每一個應用程序都要有一個Man ...
  • 因爲有的時候我們會手賤在函數中傳參導致修改數組值,所以就産生了這個東西,特點其實是讓編譯器報錯,告訴你這裏不應該被改變.如:int sum(const int ar[], int n)如果const int days
  • QueryString是一種非常簡單的傳值方式,他可以將傳送的值顯示在浏覽器的地址欄中.如果是傳遞一個或多個安全性要求不高或是結構簡單的數值時,可以使用這個方法.但是對于傳遞數組或對象的話,就不能用這個方法了.下面是
  • 暴風影音的DLNA功能是什麽 怎麽用
    暴風影音的DLNA功能是什麽?雖然常使用暴風影音但是對于DLNA功能確實不知道是做什麽的更
  • LVS是Linux Virtual Server的簡寫,意即Linux虛擬伺服器,是一個虛擬的伺服器集群系統了,今天小編就用到了lvs了,下面一起來看看Lvs負載均衡配置實驗用三台Vmware下虛擬的centos5.
  • web伺服器安全配置的內容1終端服務默認埠號:3389.更改原因:不想讓非法用戶連接到伺服器進行登錄實驗.當這台伺服器托管在外時更不希望發生這種情況,呵呵,還沒忘記2000的輸入法漏洞吧?更改方法: (1).第一處[