使用Visio Viewer载入数据库中的Visio图

简介:

需求很简单,在SQL Server数据库中存放用户上传的Visio文件,然后使用Visio Viewer在IE中直接显示用户上传的Visio文件的内容。

对于这个需求,我们需要分成两部分:

1.实现Visio文件的数据库存放和读取,并在Asp.Net中能够下载下来。

2.使用微软官方提供的Visio Viewer,在HTML中使用该Object来调用Visio图。

对于第一个功能。首先需要实现的是文件的上传。在文件上传时我们一般需要记录3个内容:文件的Content Type,文件名和文件的二进制内容。用户上传文件保存到数据库的功能代码很简单,我这里就不累述了。

然后说一下下载功能,我们新建一个ViewFile.aspx文件,然后在后台代码中编写如下:

protected void Page_Load(object sender, EventArgs e)
       {
           var p = Mgr.GetProcessByID(Request.QueryString["id"]);
           Page.Response.Clear();
           Page.Response.ContentType = p.FileContentType; //内容类型
           Page.Response.AddHeader("Content-Disposition", "attachment;FileName=" + p.FileName);//文件名
           Page.Response.BinaryWrite(p.ProcessFile.ToArray());//文件内容
           Page.Response.End();
       }

OK ,就这么简单,现在我们只需要运行程序,然后Url中输入ViewFile.aspx?id=6就可以读取到ID=6的Visio文件并下载下来。

接下来再说Visio Viewer的调用,编写一个新的页面VisioView.aspx,

protected void Page_Load(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("<object classid=clsid:279D6C9A-652E-4833-BEFC-312CA8887857  id=vviewer ");
            sb.Append("codebase=http://download.microsoft.com/download/4/5/2/452f8090-413f-408f-83c0-edd66db786ee/vviewer.exe Width =100% Height = 600 > ");
            sb.Append("<param name=SRC value=" + "http://localhost:2303/VisioFile.aspx?id=6" + "> ");
            sb.Append("<param name=HighQualityRender value=1> ");
            sb.Append("<param name=BackColor value=#000000> ");
            sb.Append("<param name=PageColor value=#000000> ");
            sb.Append("<param name=PageVisible value=1> ");
            sb.Append("<param name=AlertsEnabled value=1> ");
            sb.Append("<param name=ContextMenuEnabled value=1> ");
            sb.Append("<param name=GridVisible value=1> ");
            sb.Append("<param name=PropertyDialogEnabled value=1> ");
            sb.Append("<param name=ScrollbarsVisible value=1> ");
            sb.Append("<param name=ToolbarVisible value=1> ");
            sb.Append("<param name=CurrentPageIndex value=1> ");
            sb.Append("<param name=Zoom value=-1> ");
            sb.Append("</object>");
            lvisio.Text = sb.ToString();//这里是一个Literal控件
        }
这个地方的代码都是正确的,但是我们运行asp.net页面却会弹出错误“Microsoft Office Visio Viewer无法加载指定的URL或文件。”,如图: 

image

Visio文件正常下载,那么说明我们的src参数是正确的啊!这是什么原因造成的呢,经过简单的研究,发现原来是Visio Viewer的一个Bug吧,这个控件他只认识Visio格式后缀的url,而我们这里的文件URL是VisioFile.aspx?id=6,这个地方Visio Viewer认为不是一个Visio文件,所以根本不加载其中的内容了。

那么怎么解决呢?办法有好几个:

1.做一个.vsd的httphandler,然后指定解释.vsd格式的类,这样URL就变成了XXX.vsd格式了。

2.加一个无聊的参数:xx=.vsd。这样Visio Viewer就以为这个路径是Visio文件并进行加载了。

我采用第二个方案,修改代码第6行:

sb.Append("<param name=SRC value=" + "http://localhost:2303/VisioFile.aspx?id=6" + "&xx=.vsd> ");

OK,我们存放在数据库中的Visio就可以正常显示在Visio Viewer中了。

本文转自深蓝居博客园博客,原文链接:http://www.cnblogs.com/studyzy/archive/2010/03/16/1687698.html,如需转载请自行联系原作者

相关文章
ArcGIS:解决ArcGIS一添加数据就闪退的问题.
ArcGIS:解决ArcGIS一添加数据就闪退的问题.
382 0
|
6月前
|
定位技术
ArcGIS中各版本ArcMap安装OpenStreetMap编辑工具集插件ArcGIS Editor for OSM
ArcGIS中各版本ArcMap安装OpenStreetMap编辑工具集插件ArcGIS Editor for OSM
204 1
【ArcGIS教程】ArcMap中如何导入外部Excel属性数据呢?
【ArcGIS教程】ArcMap中如何导入外部Excel属性数据呢?
【ArcGIS教程】ArcMap中如何导入外部Excel属性数据呢?
PowerDesigner工具箱palette关了如何重新打开
PowerDesigner工具箱palette关了如何重新打开
228 0
PowerDesigner 16.5版本显示工具箱
PowerDesigner 16.5版本显示工具箱
329 0
|
测试技术
Visio画Visio图
为什么要绘制活动图? 当我们真正地进入了编码阶段,我们写程序的时候需要按照一定的业务逻辑来组织我们的代码。这就要求我们要细化一个用例所需要涉及的业务流程。活动图用来描述一个业务过程或一个用例的顺序流。   用Visio2010绘制活动图 1、选择模型   2、常用的符号。Visio2010中工具栏对活动图常用的符号都已经有中文描述,这里不再一一介绍。   3、至
2631 0
|
BI C# 数据格式
VS2017 处理 Rdlc , microsoft report viewer 轻量级报表处理(WPF CS客户端版本)
原文:VS2017 处理 Rdlc , microsoft report viewer 轻量级报表处理(WPF CS客户端版本) VS 2017没有安装处理Rdlc的包,需要手动安装; 点击主菜单中Tools 下拉菜单中 扩展和升级: 点选左侧Online  ,然后在右侧输入rdlc进行查...
2381 0
下一篇
无影云桌面