如何实现基于CS系统 + Windwos Live Writer客户端工具 组合本地发布图片

前些日子看到DUDU的“[功能改进]通过WindowsLiveWriter上传图片”,马上来了兴趣,一是通过WindowsLiveWriter书写Blog确实比起在线书写要方便、快捷、稳定,更符合日常书写习惯;二是我目前也正好在规划基于CS系统的一个社区,刚好这些天在考虑是否到时向用户推介配合WindowsLiveWriter作为客户端书写工具;还有一个很重要的因素是,WindowsLiveWriter支持插件,目前Laurent Kempé 提供有5个插件,包括Code Syntax HighlighterPaste Clipboard as Html等,而且WindowsLiveWriter SDK 提供有如果针对WindowsLiveWriter开发的插件的Sample

通过咨询DUDU,并查阅WindowsLiveWriter官方帮助,获知WindowsLiveWriter通过两种方式实现本地图片上传:1FTP方式;2metaWeblog API支持。

个人感觉FTP方式有所不妥,所以确定选用metaWeblog API方式,查阅metaWeblog API的相关信息,发现只要在支持metaWeblogblog系统中实现metaWeblog.newMediaObject (blogid, username, password, struct) returns struct方法,剩下的图片上传处理就交给WindowsLiveWriter来管理了。

那么CS系统如何(在何处)提供metaWeblog API支持,通过分析CS系统项目,发现在CS解决方案的CommunityServerBlogs20项目中实现了ImetaWeblog接口,同时有MetaWeblog实现。

具体的工作是:

1、在ImetaWeblog接口中定义newMediaObject()方法;

1        [XmlRpcMethod("metaWeblog.newMediaObject"
2            Description = "Add a media object to a post using the " 
3            + "metaWeblog API. Returns media url as a string.")]
4        MetaWeblog.MediaObjectUrl newMediaObject(
5            string blogid, 
6            string username, 
7            string password, 
8            MetaWeblog.MediaObject mediaObject);


2、在MetaWeblog中实现newMediaObject()方法。

 1        /// <summary>
 2        /// Post a media object.
 3        /// </summary>
 4        /// <param name="blogid">The blogid.</param>
 5        /// <param name="username">The username.</param>
 6        /// <param name="password">The password.</param>
 7        /// <param name="mediaObject">The media object.</param>
 8        /// <returns>MediaObjectUrl  defining the url of the media</returns>

 9        public MediaObjectUrl newMediaObject(string blogid,string username,string password,MediaObject mediaObject)
10        {
11            if (!ValidateUser(username, password))
12            {
13                throw new XmlRpcFaultException(0"You have no right to do that.");
14            }

15
16            string filename = Path.Combine(HttpContext.Current.Request.PhysicalApplicationPath, "images/" + username + "/" + mediaObject.name);
17
18            if (!Directory.Exists(Path.GetDirectoryName(filename)))
19            {
20                Directory.CreateDirectory(Path.GetDirectoryName(filename));
21            }

22
23            File.WriteAllBytes(filename, mediaObject.bits);
24
25            MediaObjectUrl mediaObjectUrl = new MediaObjectUrl();
26
27            mediaObjectUrl.url =  ConfigurationManager.AppSettings["BlogUrl"+ "/images/" + username + "/" + mediaObject.name; 
28
29
30            return mediaObjectUrl;
31        }

 

接下来的工作就是到WindowsLiveWriter中来体验blog的书写快乐了!

posted @ 2006-09-08 15:01 V.Enjoy 阅读(1811) 评论(4)  编辑 收藏 网摘 所属分类: C#&Asp.net

  回复  引用    
#1楼 2006-09-08 15:49 | baoyu [未注册用户]
8错
  回复  引用    
#2楼 2006-09-08 17:10 | 柯南[匿名] [未注册用户]
ImetaWeblog接口?不是太了解。
回去研究研究。
  回复  引用    
#3楼 2006-09-09 10:27 | jacky[匿名] [未注册用户]
@柯南[匿名]
http://www.sunminwei.com/ShowBlog/Technology/Specification/RFCMetaWeblogAPI.aspx


前两天我也刚搞了一个,开始由于用的xml-rpc的类库版本太低了,就出些莫名奇妙的错误。

我觉得Windows Live Writer 一次会传多个图片,比较不爽,不知道是否是我WLR的设置问题。
  回复  引用  查看    
#4楼 2006-10-02 01:17 | AlphaWu      
你好,为什么我的会出现如下错误呢?

System.UriFormatException: 无效的 URI: 无法确定 URI 的格式。
在 System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
在 System.Uri..ctor(String uriString)
在 WindowsLive.Writer.BlogClient.WeblogBlogFileUploader.UploadFile(FileInfo file)
在 WindowsLive.Writer.PostEditor.ImageServices.BlogFileUploadImageService.UploadImages(IUploadImageContext uploadImageContext)
在 WindowsLive.Writer.PostEditor.BlogPostReferenceFixer.ImageUploadWorker.DoUploadWork()
在 WindowsLive.Writer.PostEditor.BlogPostReferenceFixer.LocalFileTransformer(String reference)
在 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.LocalFileReferenceFixupFilter.FixReferences(String reference)
在 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.OnBeginTag(BeginTag tag)
在 WindowsLive.Writer.CoreServices.LightWeightHTMLDocumentIterator.Parse()
在 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.FixLocalFileReferences(String html, ReferenceFixer fixer)
在 WindowsLive.Writer.PostEditor.UpdateWeblogAsyncOperation.LocalSupportingFileUploader.UploadFiles()
在 WindowsLive.Writer.PostEditor.UpdateWeblogAsyncOperation.DoWork()
在 WindowsLive.Writer.CoreServices.AsyncOperation.InternalStart()
在 System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
在 System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(RuntimeMethodHandle md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
在 System.Runtime.Remoting.Messaging.StackBuilderSink.AsyncProcessMessage(IMessage msg, IMessageSink replySink)






标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

相关文章:

相关链接: