如何用FCKEditor编辑器上传图片、FLASH、视频到MOSS的图片库中
FCKEditor编辑器是一款功能齐全,性能出色的编辑器。
FCKEditor由于其开放源码,自定义非常强大,因此应用范围非常广泛,许多著名论坛的编辑器都是基于此编辑器更改的。MOSS中的RTF编辑器小巧精悍,但功能齐全性上略有不及,很难适应挑涤的企业用户的需求。因此,在信息发布等模块中,通常采用其它的第三方编辑器。如果采用其它编辑器,它与MOSS的楔合度将是一个不得不考虑的问题。楔合度越高,在用户体验,后期维护上占有比较大的优势。
这里我将讲解更改FCKEditor的上传图片等文件的方式提高楔合度的一个案例。FCKEditor默认情况下,图片等文件是上传到服务器文件系统中的一个文件夹内的。这种设计机置在其它的项目中,可能不会有什么问题,但如果在MOSS项目中,将是一个不得不正视的问题。
第一、MOSS备份需要额外考虑该文件夹的备份。
第二、在NLB环境下,文件上传将会随机上传到NBL中的某一台前端上,这是一个非常严重的缺陷,用户访问时,可能造成文件访问不到。因此,如果FCKEditor要应用到MOSS中,将不得不更改这种上传机置。试想,如果能够将图片等文件上传到MOSS中的图片库或文档库上,那么一切将迎刃而解了。
具体实现如下:
一、打开FCKeditor.Net_2.6.3工程。(网上可以下载,FCKEditor支持.net的源码)
二、FileWorkerBase.cs
更改FileUpload方法。增加图片压缩方法CreateThumbnail.
protectedvoidFileUpload(stringresourceType,stringcurrentFolder,boolisQuickUpload) { HttpPostedFileoFile=Request.Files["NewFile"]; stringsFileName=""; if(oFile==null) { this.SendFileUploadResponse(202,isQuickUpload); return; } //Mapthevirtualpathtothelocalserverpath. //stringsServerDir=this.ServerMapFolder(resourceType,currentFolder,isQuickUpload); //Gettheuploadedfilename. sFileName=System.IO.Path.GetFileName(oFile.FileName); sFileName=this.SanitizeFileName(sFileName); stringsExtension=System.IO.Path.GetExtension(oFile.FileName); sExtension=sExtension.TrimStart('.'); if(!this.Config.TypeConfig[resourceType].CheckIsAllowedExtension(sExtension)) { this.SendFileUploadResponse(202,isQuickUpload); return; } if(this.Config.CheckIsNonHtmlExtension(sExtension)&&!this.CheckNonHtmlFile(oFile)) { this.SendFileUploadResponse(202,isQuickUpload); return; } intiErrorNumber=0; //intiCounter=0; //文件上传到新闻图片库中 stringstrFileUrl=string.Empty; stringstrURL="http://"+this.Page.Request.Url.Authority; SPSecurity.RunWithElevatedPrivileges(delegate { //创建指定站点集 using(SPSitesite=newSPSite(strURL)) { //打开网站 using(SPWebweb=site.OpenWeb()) { stringstrUserName=SPContext.Current.Web.CurrentUser.LoginName; strUserName=strUserName.Substring(strUserName.LastIndexOf("")+1); SPPictureLibraryplb=(SPPictureLibrary)web.Lists["新闻图片库"]; oFile.InputStream.Position=0; MemoryStreamfStream=newMemoryStream(); if(sExtension.ToLower().Equals("jpg")|| sExtension.ToLower().Equals("gif")|| sExtension.ToLower().Equals("jpeg")|| sExtension.ToLower().Equals("png")|| sExtension.ToLower().Equals("bmp")) { #region图像压缩开始 Streamstream=oFile.InputStream; BitmapmyBitmap=newBitmap(stream); intWidth=myBitmap.Width; intHeight=myBitmap.Height; if(Width>700) { Width=700; Height=myBitmap.Height*700/myBitmap.Width; } System.Drawing.ImagemyThumbnail=CreateThumbnail(myBitmap,Width,Height,false); //ConfigureJPEGCompressionEngine System.Drawing.Imaging.EncoderParametersencoderParams=newSystem.Drawing.Imaging.EncoderParameters(); long[]quality=newlong[1]; quality[0]=75; System.Drawing.Imaging.EncoderParameterencoderParam=newSystem.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality,quality); encoderParams.Param[0]=encoderParam; System.Drawing.Imaging.ImageCodecInfo[]arrayICI=System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders(); System.Drawing.Imaging.ImageCodecInfojpegICI=null; for(intx=0;x<arrayICI.Length;x++) { if(arrayICI[x].FormatDescription.Equals("JPEG")) { jpegICI=arrayICI[x]; break; } } myThumbnail.Save(fStream,jpegICI,encoderParams); #endregion myThumbnail.Dispose(); myBitmap.Dispose(); } else { fStream=(MemoryStream)oFile.InputStream; } fStream.Position=0; intintLength=(int)fStream.Length; byte[]contents=newbyte[intLength]; fStream.Read(contents,0,intLength); //fStream.Read(contents,0,(int)fStream.Length); strFileUrl="http://"+this.Page.Request.Url.Authority+plb.DefaultViewUrl.Substring(0,plb.DefaultViewUrl.LastIndexOf("Forms/")); web.AllowUnsafeUpdates=true; sFileName=DateTime.Now.Year.ToString()+ DateTime.Now.Month.ToString()+ DateTime.Now.Day.ToString()+ DateTime.Now.Hour.ToString()+ DateTime.Now.Minute.ToString()+ DateTime.Now.Second.ToString()+ DateTime.Now.Millisecond.ToString()+"."+sExtension; strFileUrl+=sFileName; SPFilespfile=web.Files.Add(strFileUrl,contents); fStream.Dispose(); } } }); this.SendFileUploadResponse(0,true,strFileUrl,sFileName); } ///<summary> ///AbetteralternativetoImage.GetThumbnail.Higherqualitybutslightlyslower ///</summary> ///<paramname="source"></param> ///<paramname="thumbWi"></param> ///<paramname="thumbHi"></param> ///<returns></returns> publicstaticBitmapCreateThumbnail(Bitmapsource,intthumbWi,intthumbHi,boolmaintainAspect) { //returnthesourceimageifit'ssmallerthanthedesignatedthumbnail if(source.Width<thumbWi&&source.Height<thumbHi)returnsource; System.Drawing.Bitmapret=null; try { intwi,hi; wi=thumbWi; hi=thumbHi; if(maintainAspect) { //maintaintheaspectratiodespitethethumbnailsizeparameters if(source.Width>source.Height) { wi=thumbWi; hi=(int)(source.Height*((decimal)thumbWi/source.Width)); } else { hi=thumbHi; wi=(int)(source.Width*((decimal)thumbHi/source.Height)); } } //originalcodethatcreateslousythumbnails //System.Drawing.Imageret=source.GetThumbnailImage(wi,hi,null,IntPtr.Zero); ret=newBitmap(wi,hi); using(Graphicsg=Graphics.FromImage(ret)) { g.InterpolationMode=System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.FillRectangle(Brushes.White,0,0,wi,hi); g.DrawImage(source,0,0,wi,hi); } } catch { ret=null; } returnret; }