美文网首页
应用程序与 Office Web Apps 整合

应用程序与 Office Web Apps 整合

作者: 匆匆那年过客 | 来源:发表于2018-12-02 11:14 被阅读0次

    【本文转自http://www.chenyp.com/2016/03/17/office-online-app/   by DistChen】

    关于部署的细节,可以参考我的另一篇文章《在线浏览 Office 文档之 Office Web Apps》

    关于 Wopi 协议,可以参考如下的链接:

    [MS-WOPI]:Web Application Open Platform Interface Protocol

    https://msdn.microsoft.com/en-us/library/hh622722(v=office.12).aspx

    IntroducingWOPI

    http://blogs.msdn.com/b/officedevdocs/archive/2013/03/21/introducing-wopi.aspx

    Buildingan Office Web Apps (OWA) WOPI Host:

    https://code.msdn.microsoft.com/office/Building-an-Office-Web-f98650d6

    CSDN 上面也有类似的文章,基本上也就是根据上面的文章翻译过来并加上了自己理解的: 如何整合Office Web Apps至自己开发的系统(一) 。如果你认真读了这些文章,那么你现在应该知道为了将自己的程序(Wopi Host)与Office Web Apps (Wopi Client)整合起来,Wopi Host至少得提供两个服务:

    1、CheckFileInfo服务,此服务会返回文件的基本信息

    详情可参考[MS-WOPI] section 3.3.5.1.1 章节

    2、GetFile服务,此服务根据上一个服务返回的基本信息返回对应文件的数据流

    详情可参考[MS-WOPI] section 3.3.5.3.1 章节。

    由于官方文档及上面提供的链接对此说明的很详细,这里就不多说了,我也建议在学习新东西的时候,多看看官方文档。同时,微软员工也给我们提供了一个Wopi Host 的 demo,这里就直接使用他们提供的 demo来学习了。到此处下载该demo:https://code.msdn.microsoft.com/office/Building-an-Office-Web-f98650d6。在demo的 Wopihost 项目中找到 Filecontroller.cs文件,定位到如下代码:

    1   ///<summary>

    2  ///Returns the metadata about an office document

    3  ///</summary>

    4  ///<param name="name">filename</param>

    5  ///<param name="access_token">access token generated for this server</param>

    6  ///<returns></returns>

    7  [Route("files/{name}/")]

    8  publicCheckFileInfoGetFileInfo(stringname,stringaccess_token)

    9  {

    10      Validate(name, access_token);

    11   varfileInfo = _fileHelper.GetFileInfo(name);

    12  boolupdateEnabled =false;

    13  if(bool.TryParse(WebConfigurationManager.AppSettings["updateEnabled"].ToString(),outupdateEnabled))

    14   {

    15     fileInfo.SupportsUpdate = updateEnabled;

    16     fileInfo.UserCanWrite = updateEnabled;

    17     fileInfo.SupportsLocks = updateEnabled;

    18    }

    19   returnfileInfo;

    20   }

    1  // GET api/<controller>/5

    2  ///<summary>

    3  ///Get a single file contents

    4  ///</summary>

    5  ///<param name="name">filename</param>

    6  ///<returns>a file stream</returns>

    7  [Route("files/{name}/contents")]

    8  publicHttpResponseMessageGet(stringname,stringaccess_token)

    9  {

    10  try

    11   {

    12      Validate(name, access_token);

    13  varfile = HostingEnvironment.MapPath("~/App_Data/"+ name);

    14  varresponseMessage =newHttpResponseMessage(HttpStatusCode.OK);

    15  varstream =newFileStream(file, FileMode.Open, FileAccess.Read);

    16  responseMessage.Content =newStreamContent(stream);

    17  responseMessage.Content.Headers.ContentType =newMediaTypeHeaderValue("application/octet-stream");

    18  returnresponseMessage;

    19    }

    20  catch(Exception ex)

    21   {

    22  varerrorResponseMessage =newHttpResponseMessage(HttpStatusCode.InternalServerError);

    23  varstream =newMemoryStream(UTF8Encoding.Default.GetBytes(ex.Message ??""));

    24  errorResponseMessage.Content =newStreamContent(stream);

    25  returnerrorResponseMessage;

    26    }

    27  }

    上面的两个方法就是对CheckFileInfo服务和GetFile服务的实现,理解起来并不困难。

    由于是一个demo实现,我就直接拿来部署了,等到要改造的时候再去琢磨,打开配置web.config配置文件,修改如下的配置,表示此程序将要部署的地方和别名:

    访问http://192.168.1.136/hosting/discovery,保存内容到Discovery.xml文件,用此文件替换掉demo中的 WopiHost\App_Data\Discovery.xml文件:

    我这里直接部署在Office Web Apps所在的服务器上了, 在 HTTP80网站下面添加一个应用程序,别名为dist,与web.config对应上就行了,如下所示:

    部署成功后,访问 http://192.168.1.136/dist ,打开此demo的主界面,在菜单栏upload页面里面上传一份文档,上传成功后会生成一个链接,访问链接就可以看到刚刚生成的文档了,如下所示:

    由于在web.config 中设置了 updateEnabled=true,所以这里可以对打开的excel进行编辑,如下所示:

    这个demo就算部署成功了,至于这两个服务具体实现细节,查看代码即可。值得注意的是:这个demo实现并不支持word文档的编辑,作者也进行了说明:

    The solution and project have been updated to MVC5, and Web API 2. In

    addition, editing PowerPoint (PPTX), and Excel files has been added.

    Word Editing is not part of the solution. Also, PDF viewing is

    enabled.

    在代码中位置如下:

    1  // POST api/<controller>

    2  ///<summary>

    3  ///Not implemented, but will provide editing (simple)

    4  ///</summary>

    5  ///<param name="access_token"></param>

    6  [Route("files/{name}/contents")]

    7  publicasyncvoidPost(stringname, [FromUri]stringaccess_token)

    8  {

    9  varbody =awaitRequest.Content.ReadAsByteArrayAsync();

    10  varappData = HostingEnvironment.MapPath("~/App_Data/");

    11  varfileExt = name.Substring(name.LastIndexOf('.') +1);

    12  varoutFile = Path.Combine(

    13          appData,name);

    14  //Guid.NewGuid().ToString() +

    15  //"_" +

    16  //name);

    17  //var fi = new FileInfo(outFile);

    18      File.WriteAllBytes(outFile, body);

    19  }

    这里应该是故意不给实现的,要想实现word编辑,就得靠各位的努力了,我也在研究中,希望和大家一起交流交流。当然,你也可以用任何的语言来实现这个程序,只要保证那两个接口能返回相应的文件信息和对应的数据流就行了,至于文件放在何处,用什么语言,这都是小事。

    相关文章

      网友评论

          本文标题:应用程序与 Office Web Apps 整合

          本文链接:https://www.haomeiwen.com/subject/decjcqtx.html