使用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或文件。”,如图:

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中了。

时间: 2024-12-25 00:37:29

使用Visio Viewer载入数据库中的Visio图的相关文章

VB.NET WinCE读取数据库中的矢量图

问题描述 急!~~~~~~~我用VB.NET开发WinCe小程序,需要从SqlCE数据库中读取后缀名为.wmf的矢量图.请各位大侠指点...谢谢啦!~

请教!!使用VB.net制作网站时,在datalist里面放了两个textbox,并要实现在textbox里面录入值,并加到数据库中。

问题描述 请教!!使用VB.net制作网站时,在datalist里面放了两个textbox,并要实现运行时在textbox里面录入值,并将值添加到数据库中.如图:[img=http://C:DocumentsandSettingsAdministrator.SA-DBA93C0E7E83桌面][/img]具体怎么实现??越祥细越好.先谢过了! 解决方案 解决方案二:图片没放上去,也就是一个数据绑定,后跟一个TEXTBOX空白框,再跟个数据绑定,后跟一个TEXTBOX空白框.

Visual Studio .NET Enterprise Architect 中基于 Visio 的数据库建模:第三部分

enterprise|visual|数据|数据库  Terry HalpinMicrosoft Corporation 2001年11月 摘要:本文是介绍 Microsoft Visual Studio .NET Enterprise Architect 中基于 Visio 的数据库建模组件系列文章中的第三篇,第一部分讨论了如何创建基本对象角色建模 (ORM) 源模型,如何将其映射到逻辑数据库模型,以及如何生成物理数据库架构的 DDL 脚本.第二部分讨论了如何使用描述器,将对象类型标记为独立类型

Visual Studio .NET Enterprise Architect 中基于 Visio 的数据库建模:第一部分/1

enterprise|visual|数据|数据库 Terry HalpinMicrosoft Corporation 2001年11月 摘要:本文是介绍 Microsoft Visual Studio .NET Enterprise Architect 中基于 Visio 的数据库建模组件系列文章中的第一篇,重点介绍该工具提供的对象角色建模 (ORM) 支持. 目录 简介 创建新的 ORM 模型 使用 Fact Editor(事实编辑器) 添加句子类型 使用 Fact Editor(事实编辑器)

Visual Studio .NET Enterprise Architect 中基于 Visio 的数据库建模:第二部分

enterprise|visual|数据|数据库  Terry HalpinMicrosoft Corporation 2001年11月 摘要:本文是介绍 Microsoft Visual Studio Enterprise Architect 中基于 Visio 的数据库建模组件系列文章中的第二篇.第一部分讨论了如何创建新的对象角色建模 (ORM) 源模型,如何在 fact editor(事实编辑器)中添加句子类型.基本内部约束及示例,如何将事实类型从 business rules edito

hibernate查出的值与数据库中不一致的问题

问题描述 页面上有个值是用person.getAccount()取的,当手动在数据库改了那一列的话,然后再在页面上查一下显示的还是以前的值??怎么解决 解决方案 解决方案二:ie缓存问题吧,你重启下试试,还不行就把服务器中的项目部署时生成的项目文件删除,tomcat在work目录下找其他服务器上网上找解决方案三:应该是缓存问题吧试试调整一下工程里面的hibernate缓存机制解决方案四:缓存没有及时更新解决方案五:引用1楼ak47zhoujun123的回复: ie缓存问题吧,你重启下试试,还不行

c#代码-C#对SQLServer数据库中数据的修改

问题描述 C#对SQLServer数据库中数据的修改 在DataGridView中选中一行数据,使得对应列的内容显示在TextBox中,点击"修改"按钮,数据库中的信息被修改."修改"按钮和DataGridView在同一窗体. 解决方案 修改是一个连接 传一个ID前往另一个页面,获取出你修改的那条信息,然后建立一个模型生成get(),set()方法.用foreach()实例化gridview一个对象,把控件中的值存放在模型中,注意page_load()事件中用if(

sqlite删除数据库中的数据时偶尔会出现错误

问题描述 sqlite删除数据库中的数据时偶尔会出现错误 java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed. 求助,connection pool 是啥啊,求大神指教. 解决方案 如果确定不是连接被关闭,那还有可能就是多线程访问sqlite,sqlite数据库是单线程操作的,那么当N多个Thread同时调用的时候,可能报这错误.这也就

哪位大神指导一下,关于Oracle数据库中类型varchar2(2) 存储汉字的问题

问题描述 哪位大神指导一下,关于Oracle数据库中类型varchar2(2) 存储汉字的问题 大神们跪求招数:orcale数据库中的一个字段YXQDW(有效期单位) 类型varchar2(2) 才两字节 用来存一个汉字,比如"年",我的项目(C#)一个汉字占用3个字节, 写SQL语句 insert不进去啊,提示字段范围超出了.难不成要像blob字段那样写?或者有什么更好的方式能将该字段插入呢?万分感激! 解决方案 可以换成nvarchar(2),这个是可变长度