http://www.dianju.cn/forum/viewtopic.php?t=9249WebOffice开发系列指南
WebOffice文档控件技术交流和版本发布
由 hangel » 2010-07-12 11:33
WebOffice开发系列01-自动下载安装组件(B/S)
WebOffice开发系列02-如何打开文件
WebOffice开发系列03-修订留痕
WebOffice开发系列04-安全控制 (防止复制、打印、保存)
WebOffice开发系列05-菜单控制
WebOffice开发系列06-自定义工具栏 (添加工具栏按钮、调节工具栏颜色)
WebOffice开发系列08-文件上传到服务器
WebOffice开发系列09-其他功能-全屏-VBA
webOffice控件自动下载是指在打开网页时,网页会自动把webOffice控件下载下来,从而可以将word、excel嵌入到网页中。控件自动下载的相关代码如下:
< object id=WebOffice height=768 width="100%"
style="LEFT: 0px; TOP: 0px" classid="clsid:E77E049B-23FC-4DB8-B756-60529A35FAD5" codebase="../js/WebOffice1.ocx#version=6,0,4,0">
<param name="_ExtentX" value="6350">
<param name="_ExtentY" value="6350">
</object>
上面的脚本意思是: 自动更新classid= FF1FE7A0-0578-4FEE-A34E-FB21B277D561 的COM组件,
更新地址为 ../js/WebOffice1.ocx,codebase后的路径为相对路径也可为绝对路径,要更新的最新版本为6,0,4,0。
此时,IE会自动访问注册表,如果发现当前机器未安装或者当前版本低于6,0,4,0,就会自动下载。
帖子: 10
注册: 2010-07-12 10:39
由 hangel » 2010-07-12 11:33
单击打开文件按钮,可以在webOffice中打开文件,具体操作如图所示:
1004291534911966484dcfde21.jpg
打开文档的接口为LoadOriginalFile,其接口描述如下:
原 型: long LoadOriginalFile(BSTR pcFileNameOrUrl, BSTR pcType);
功 能:新建、装载Office文档
参 数:
pcFileNameOrUrl:
要装载文件的本地路径或者URL,值为空表示新建文档,如果是在Http的Web环境下,可以传相对路径.
pcType:
doc:打开、新建Word文件
xls:打开、新建Excel文件
ppt:打开、新建PPT 文件
wps:打开、新建WPS 文件
返回值:
为 0:失败
非0:成功
示 例:
// 通过URL打开一个服务器文件,getdoc.asp代码见演示文件
document.all.WebOffice1.LoadOriginalFile("http://127.0.0.1/getdoc.asp?id=8", "doc");
// 通过URL打开一个服务器文件,相对路径
document.all.WebOffice1.LoadOriginalFile("/getdoc.asp?id=8", "doc");
document.all.WebOffice1.LoadOriginalFile("./getdoc.asp?id=8", "doc");
// 新建Excel
document.all.WebOffice1.LoadOriginalFile("", "xls");
==================特别注意===============================
建议在NotifyCtrlReady 事件中调用 LoadOriginalFile 接口,否则有可能出现Word窗口脱离IE界面的问题。
<SCRIPT language=JavaScript event=NotifyCtrlReady for=WebOffice1>
/****************************************************
*
* 在装载完Weboffice(执行<object>...</object>)
* 控件后执行 "WebOffice1_NotifyCtrlReady"方法
*
****************************************************/
WebOffice1_NotifyCtrlReady()
</SCRIPT>
WebOffice1_NotifyCtrlReady(){
document.all.WebOffice1.LoadOriginalFile("", "doc");
}
您没有权限查看这个主题的附件。
帖子: 10
注册: 2010-07-12 10:39
由 hangel » 2010-07-12 11:38
webOffice对文档的修订操作提供了丰富的接口,其接口为:document.all.WebOffice1.SetCurrUserName("user_name");
文档操作的具体步骤如图所示,先以Test用户身份对文档进行编辑,如图所示:
10042915368ed41a99e4cc92ba.jpg
编辑完成上传后,其他用户如果想修订文档可以单击“修订文档”的按钮,接口为:
// 开始修订
document.all.WebOffice1.SetTrackRevisions(1);
// 接受修订
document.all.WebOffice1.SetTrackRevisions(4);
编辑文档的时候字体会针对不同的用户显示不同的颜色,如下图所示:
10042915369c8f50cabf3a5c18.jpg
单击“显示修订”会显示所有其他用户的修改和删除的操作,单击“隐藏修订”时就会隐藏所有的修订,
文档文字的颜色会变成同原文档的文字一样,而且删除的横线也会去掉,其接口如下:
// 隐藏修订
document.all.WebOffice1.ShowRevisions(0);
// 隐藏修订
document.all.WebOffice1.ShowRevisions(0);
如下图所示:
10042915369c8f50cabf3a5c18.jpg
单击“接受所有修订”则文档的修订就会生效,否则单击“拒绝所有修订”文档的所有修订失效,文档内容和初稿内容一致。
//接受当前所有修订信息
document.all.WebOffice1.SetTrackRevisions(4);
单击“获取修订信息”则会获取所有对文档进行修订的用户的相关信息及修订日期,接口描述如下:
原 型: BSTR GetRevInfo(long lIndex, long lType);
功 能:获取修订节点的信息(修订人,修订的时间,修订的动作)
参 数:
lIndex: 修订的节点编号
lType: 获取的信息编号
返回值:
示 例:
//1.获取修订的用户
vUserName = document.all.WebOffice1.GetRevInfo(i,0);
//2.获取修订的时间
vDate = new String(document.all.WebOffice1.GetRevInfo(i,1));
//3.获取修订的动作
var vRet = document.all.WebOffice1.GetRevInfo(i,2);
vRet == "1":表示"插入"的操作
vRet == "2":表示"删除"的操作
//4.获取修订的内容
vUserName = document.all.WebOffice1.GetRevInfo(i,3);
//总体的例子代码
var vCount;
vCount = document.all.WebOffice1.GetRevCount();
var vOpt = 0;
var vDate;
for(var i=1; i<= vCount; i++){
vOpt = document.all.WebOffice1.GetRevInfo(i,2);
if("1" == vOpt){
vOpt = "插入";
}else if("2" == vOpt){
vOpt = "删除";
}else{
vOpt = "未知操作";
}
vDate = new String(document.all.WebOffice1.GetRevInfo(i,1));
vDate = parseFloat(vDate);
dateObj = new Date(vDate);
alert(dateObj.getYear() + "年" + dateObj.getMonth() + 1 + "月" + dateObj.getDate() +"日" + dateObj.getHours() +"时" + dateObj.getMinutes() +"分" + dateObj.getSeconds() +"秒" );
alert("用户:"+document.all.WebOffice1.GetRevInfo(i,0) + "\r\n操作:" + vOpt + "\r\n内容:" + document.all.WebOffice1.GetRevInfo(i,3));
}
100429153626ae947d8d6fde50.jpg
您没有权限查看这个主题的附件。
帖子: 10
注册: 2010-07-12 10:39
WebOffice开发系列04-安全控制 (防止复制、打印、保存)
由 hangel » 2010-07-12 11:41
Weboffice可以对word文档实行全面的安全控制,增强了文档的安全性,用户在编辑文档后在输入框中输入密码,
然后单击“保护文档”,上传保存后别的用户则无法对文档进行编辑,需要输入正确的密码后才可编辑,接口描述如下:
原 型: long ProtectDoc(long lProOrUn, long lType, BSTR strPWD);
功 能:文档保护
参 数:
lProOrUn:
└ 1:为保护文档
└ 0:为解锁文档
lType :
└ 0 :文档保护,只允许修订
└ 1 :文档保护,只允许批注
└ 2 :文档完全保护,不允许任何操作
strPWD:文档保护、解锁时所需设置的密码
返回值:
示 例:
// 保护文档,只允许修订
document.all.WebOffice1.ProtectDoc(1, 0, "12345");
// 解锁文档
document.all.WebOffice1.ProtectDoc(0, 0, "12345");
如图所示:
10042915390aef3d09dccc1c7f.jpg
单击“禁止打印”可以防止非法用户对文档进行打印操作,单击“禁止复制”可以去掉word的复制粘贴功能,单击“允许复制”则恢复。
相关的接口描述如下:
原 型: long SetSecurity(long lFlag)
功 能:
设置文档安全选项
参 数:
lFlag:按位标记的控制开关。
0x01表示不允许打印(当第一位为1时有效)
0x02表示不允许保存(当第二位为1时有效)
0x04表示不允许复制(当第三位为1时有效)
0x08表示不允许拖动(当第四位为1时有效)
0x8000表示清除开关(当最高位为1时有效)
返回值:
示 例:
//禁止打印
Object.SetSecurity(0x01);
//恢复允许打印
Object.SetSecurity(0x01 + 0x8000);
//禁止保存
Object.SetSecurity(0x02);
//恢复允许保存
Object.SetSecurity(0x02 + 0x8000);
//禁止复制
Object.SetSecurity(0x04);
//恢复允许复制
Object.SetSecurity(0x04 + 0x8000);
//禁止打印、保存、复制
Object.SetSecurity(0x01+0x02+0x04);
//恢复允许打印、保存、复制
Object.SetSecurity(0x01+0x02+0x04+0x8000);
通过事件方式进行安全控制,原理是通过weboffice控件中的NotifyWordEvent事件捕获捕获部分Word/Excel/Wps事件,在事件执行前进行相关设置,从而对word文档进行安全控制。
您没有权限查看这个主题的附件。
帖子: 10
注册: 2010-07-12 10:39
由 hangel » 2010-07-12 11:42
由于控件升级 现在控制菜单有两种方式:
新接口:
屏蔽菜单
1.《2003屏蔽所有的菜单,除了参数的4个菜单。
2.《2007 功能区隐藏。当 pcExcludeBar1= "show" 功能区显示,否则隐藏
HideMenuArea(LPCTSTR pcExcludeBar1, LPCTSTR pcExcludeBar2, LPCTSTR pcExcludeBar3, LPCTSTR pcExcludeBar4)
示例:
隐藏offcie 2003所有菜单工具栏格式栏等
document.all.WebOffice1.HideMenuArea(“”,””,””,””);
效果如下:
1004291736b3e45edd9e0a3714.jpg
显示菜单栏,常用工具栏:
document.all.WebOffice1.HideMenuArea(“Menu Bar”,”Standard”,””,””);
隐藏 office 2007 功能区
document.all.WebOffice1.HideMenuArea(“”,””,””,””);
显示Word 2007 功能区
document.all.WebOffice1.HideMenuArea(“show”,””,””,””);
旧接口:
Word 2003 :
short SetToolBarButton2(VARIANT lIndex, VARIANT lID, VARIANT lControl);
设置所有菜单项或者菜单项按钮的隐藏和现实
lIndex:要显示隐藏的元素名称。根据Word/Excel 的不同版本,可能有部分不同
└ Standard:常用工具条
└ Formatting:格式化工具条
└ Menu Bar:菜单栏
lID:要操作的菜单元素的位置
lControl:按钮状态控制,按位控制,如该值为1时,它的二进制为0001,表示该菜单元素是显示但不可用第一位为:是否显示。0:隐藏;1:显示第二位为:是否可用。0:不可用;1:可用。第三位为:工具栏和菜单栏是否恢复到默认状态。0:不恢复;1:恢复。第四位为:是否隐藏整个菜单栏或工具栏,1为隐藏,0为显示
示例:
//隐藏菜单栏
document.all.WebOffice1.SetToolBarButton2("Menu Bar",1,8);
//显示菜单栏
document.all.WebOffice1.SetToolBarButton2("Menu Bar",1,11);
//隐藏常用工具栏
document.all.WebOffice1.SetToolBarButton2("Standard",1,8);
//显示常用工具栏
document.all.WebOffice1.SetToolBarButton2("Standard",1,11);
//隐藏格式工具栏
document.all.WebOffice1.SetToolBarButton2("Formatting",1,8);
//显示格式工具栏
document.all.WebOffice1.SetToolBarButton2("Formatting",1,11);
效果图如下:
100429173778c902439dcacf57.jpg
此时用户如果需要将自带工具栏也隐藏可以采用weboffice工具栏隐藏接口:
document.all.WebOffice1.ShowToolBar=0;// 0 隐藏 1 显示
效果如图:
100429173778c902439dcacf57.jpg
1 小时前
Word 2007:
long HideMenuAction(short shMenuMode, long lValue);
hMenuMode:设置模式:具体值及含义如下:
0:Office2003以下,直接关闭菜单,暂未支持。可使用SetToolBarButton2接口控制
1:Office2007以上,需要设置关闭菜单列表
2:扩展值,暂无含义
3:扩展值,暂无含义
4:扩展值,暂无含义
5:设置关闭菜单列表后,需调用此值激活。并第二个参数设置为0,具体见示例。
6:恢复菜单显示及功能使用,第二个参数设置为0
lValue:设置要隐藏的菜单及禁止复制、粘贴功能
0x1000:十进制为4096--粘贴无效
0x2000:十进制为8192—复制无效
0x100000:十进制为1048576—开始菜单
0x200000:十进制为2097152—插入菜单
0x400000:十进制为4194304—页面布局菜单
0x800000:十进制为8388608—引用菜单
0x1000000:十进制为16777216—邮件菜单
0x2000000:十进制为33554432—审阅菜单
0x4000000:十进制为67108864—视图菜单
0x8000000:十进制为134217728—开发工具菜单
0x10000000:十进制为268435456—加载项菜单
//设置粘贴无效
document.all.WebOffice1. HideMenuAction(1,4096);//设置动作
document.all.WebOffice1. HideMenuAction(5,0);//激活设置
//设置复制无效
document.all.WebOffice1. HideMenuAction(1,4096);
document.all.WebOffice1. HideMenuAction(5,0);
//设置开始菜单隐藏
document.all.WebOffice1. HideMenuAction(1,1048576);
document.all.WebOffice1. HideMenuAction(5,0);
//设置多菜单隐藏(比如隐藏开始、插入、页面布局菜单)
document.all.WebOffice1. HideMenuAction(1,1048576+2097152+4194304);
document.all.WebOffice1. HideMenuAction(5,0);
//恢复至设置之前状态(即正常状态)
document.all.WebOffice1. HideMenuAction(6,0);
您没有权限查看这个主题的附件。
帖子: 10
注册: 2010-07-12 10:39
WebOffice开发系列06-自定义工具栏 (添加工具栏按钮、调节工具栏颜色)
由 hangel » 2010-07-12 11:42
调节颜色:
SetCustomColour(long lType, long lColour)
lType: 设置肤色
custColorToolBarBKColor = 0, 底色
custColorToolBarMiddleColor = 1, 中间色
custColorToolBarTopColor = 2, 上色
custColorToolBarBottomColor = 3, 下色
lColour: 为颜色值 0-65535
已经有的几个模式
//淡紫色
document.all.WebOffice1.SetCustomColour(2,243*256*256+244*256+250);
document.all.WebOffice1.SetCustomColour(1,225*256*256+226*256+236);
document.all.WebOffice1.SetCustomColour(3,153*256*256+151*256+181);
document.all.WebOffice1.SetCustomColour(0,243*256*256+243*256+247);
10042916135b8801f3fa7105a9.jpg
//深蓝色
document.all.WebOffice1.SetCustomColour(2,131*256*256+97*256+59);
document.all.WebOffice1.SetCustomColour(1,239*256*256+216*256+138);
document.all.WebOffice1.SetCustomColour(3,133*256*256+94*256+53);
document.all.WebOffice1.SetCustomColour(0,130*256*256+92*256+52);
1004291613e2bbbdebd085fd6d.jpg
//浅黄色
document.all.WebOffice1.SetCustomColour(2,220*256*256+235*256+254);
document.all.WebOffice1.SetCustomColour(1,196*256*256+219*256+249);
document.all.WebOffice1.SetCustomColour(3,136*256*256+174*256+228);
document.all.WebOffice1.SetCustomColour(0,191*256*256+214*256+249);
1004291613ff44a7d13695f472.jpg
添加按钮:
SetCustomToolBtn(long lIndex, LPCTSTR pcBtnText)
设置自定义菜单的文字信息 系统内置了 5 个按钮。
SetCustomToolBtn(0,"test0");
SetCustomToolBtn(1,"test2");
SetCustomToolBtn(2,"test2");
SetCustomToolBtn(3,"test3");
SetCustomToolBtn(4,"test4");
示例:document.all.WebOffice1.SetCustomToolBtn(0, "new1");
document.all.WebOffice1.SetCustomToolBtn(1, "new2");
document.all.WebOffice1.SetCustomToolBtn(2, "new3");
document.all.WebOffice1.SetCustomToolBtn(3, "new4");
document.all.WebOffice1.SetCustomToolBtn(4, "new5");
10042916131b6837953216bbe2.jpg
如何实现自定义功能:
首先页面中要加入js监听事件
<SCRIPT language=javascript event=NotifyToolBarClick(iIndex) for=WebOffice1>
<!--
WebOffice1_NotifyToolBarClick(iIndex);
//-->
</SCRIPT>
function WebOffice1_NotifyToolBarClick(iIndex){
if(iIndex>=32776){
alert(iIndex+"新加按钮触发的事件可在这里写自己的功能");
}
}
您没有权限查看这个主题的附件。
帖子: 10
注册: 2010-07-12 10:39
由 hangel » 2010-07-12 11:43
文件上传到服务器,目前WebOffice支持四种模式:
1. WebOffice 内部发起HTTP协议的发送,采用Post模式。(详细的说明,可以参照开发文档)
WebOffice控件使用了自身的文件Http上传接口实现文件和表单域的上传保存,本文将简要介绍该上传方式的原理和使用方法。注:点聚WebOffice的上传接口和AIP是一致的。
原理
因为Web页面上的WebOffice打开的文件无法随表单记录提交到处理页面,所以我们把文件模拟成表单的文件域<input type=file …>,通过接口把文件和表单元素发送到保存记录的页面(过程类似表单的提交)。
主要上传接口:
?HttpInit();该方法用于初始化上传接口,不需要设置参数
HttpAddPostString(String FieldName, String someValue);添加要提交的表单域, FieldName是要上传表单域名称,someValue是表单域值
例一:
HttpAddPostString("username", "zhangSan");
它类似域表单域的
<input type=text name=username value=zhangSan>
例二:
HttpAddPostString("username", WebForm.username.value);
….
<form name= WebForm ><input type=text name=username value=zhangSan></form>
注意:如果使用点聚上传接口,那么form表单里的表单域不会被提交到处理页面。需要手工添加到上传接口(HttpAddPostString接口),然后通过控件发送到处理页面。例二使用了“WebForm.username.value”获取表单域值。
HttpAddPostCurrFile(String fileName, String ReName);
添加当前WebOffice编辑的文件给上传接口,该接口把文件模拟到成一个表单的文件域,并提交到处理页面。
例一:
HttpAddPostCurrFile("AipFile", "");
该接口模拟表单文件域如下:
<input type=file name=AipFile >
注意:第二个参数为空表示控件自动为文件命名,如:dj_temp.aip,如果需要重命名可以在第二个参数指明文件名称,也可在保存页面指定文件名称。
HttpPost(String url);
执行上传操作将文件和表单域提交到url的页面进行保存操作,并获取url页面返回的执行结果 (是否成功,可以根据这个结果来获取服务器端执行的结果)。
url支持绝对路径和相对路径。
绝对路径,例如:http://192.168.0.1/savedoc.asp
相对路径要以“./”或者“../”开头。例如:./savedoc.asp
完整的上传接口演示
function SaveDoc() {
var returnValue; // 保存页面的返回值
document.all.WebOffice1.HttpInit(); // 初始化Http引擎
// 添加相应的Post元素
document.all.WebOffice1.HttpAddPostString("username", WebForm. username.value);
// 添加上传文件
document.all.WebOffice1.HttpAddPostCurrFile("AipFile ","");
// 提交上传文件
returnValue = document.all.WebOffice1.HttpPost("../saveDoc.jsp");
if("true" == returnValue){
alert("文件上传成功");
} else {
alert("文件上传失败")
}
}
WebOffice上传接口将数据流以Http方式提交到保存页面,至于对数据处理就和普通的文件上传处理一样了
---------------------------------------------JSP上传代码-------------------------------------------------------------
上传按钮的onclick事件里内容:
var webObj=document.getElementById("WebOffice1");
webObj.HttpInit();
webObj.HttpAddPostCurrFile("FileBlody");//上传当前文件
webObj.HttpAddPostString("name",name);//可以通过我们的控件将一些需要传到服务器的其他内容随文档一起上传
returnValue = webObj.HttpPost("http://127.0.0.1:8080/TestWebOffice/saveDoc.jsp");
if("ok" == returnValue){
alert("上传成功!");
}else if("failed" == returnValue){
alert("上传失败!");
}
接收页面saveDoc.jsp使用了上传组件SmartUpload
<%@ page contentType="text/html;charset=GB2312" %><jsp:useBean id="mySmartUpload" scope="page" class="com.jspsmart.upload.SmartUpload" />
<%
try{
// 初始化上传组件
mySmartUpload.initialize(pageContext);
mySmartUpload.upload();
String FilePath;
com.jspsmart.upload.File myFile = null;
myFile = mySmartUpload.getFiles().getFile(0);
FilePath = myFile.getFileName();
//System.out.println(FilePath);
if (!myFile.isMissing()){
myFile.saveAs("upload/"+FilePath,mySmartUpload.SAVE_VIRTUAL);
}
out.clear();
out.print("ok");
out.flush();
}catch(Exception e){
out.clear();
out.print("failed");//返回控件HttpPost()方法值。
out.flush();
}%>
---------------------------------------------JSP上传代码 END-------------------------------------------------------------
2. 通过AJAX上传二进制数据
原理:
AJAX负责上传数据。
WebOffice负责把组织待上传的数据。
------------------------------例子------------------------------------------------------------------------------------------
//创建AJAX对象
function createXMLHttpRequest(){
var xmlHttp = null;
if (window.ActiveXObject){
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP")
}else if (window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest()
};
return xmlHttp
};
//发送数据
function Send2(){
var xmlHttp = this.createXMLHttpRequest();
var webObj=document.getElementById("WebOffice1");
webObj.HttpInit(); //初始化Http引擎
// 添加相应的Post元素
webObj.HttpAddPostString("id", "0");
webObj.HttpAddPostString("DocTitle", "Test001");
webObj.HttpAddPostString("DocID", "Test001");
webObj.HttpAddPostString("DocType","doc");
webObj.HttpAddPostCurrFile("DocContent","");
//设置接受数据的页面。采用同步发送机制。
xmlHttp.open("POST", "http://192.168.1.1/WebOffice/savedoc.jsp?time=随机数生成的时间,防止IE缓存", false);
//打包待上传的数据流
var vv = document.all.WebOffice1.GetHttpPostFormatData(1);
//发送数据
xmlHttp.setRequestHeader("Content-Type","multipart/form-data; boundary=--MULTI-PARTS-FORM-DATA-BOUNDARY");
xmlHttp.send(vv);
//判断接受数据
if (xmlHttp.status == 200){
if (!xmlHttp.responseText){
};
alert(xmlHttp.responseText);
}
alert(xmlHttp.status);
};
------------------------------例子 END------------------------------------------------------------------------------------------
3. WebOffice负责把文件生成为字符串
原理:
通过接口:GetFileBase64 把二进制文件生成为字符串。通过SaveBinaryFileFromBase64把字符串还原为二进制文件。
适用于 B/S和C/S模式。
--------------------保存字符串到数据库中-------------------------------
var v = document.all.WebOffice1.GetFileBase64("d:\\Server.dmp",1);
//把字符串赋值给隐藏域"FileData"
document.all.FileData.value = v;
//submit 就可以了。
----------------------打开字符串文件------------------------------------
//获取临时文件名
var vTempFile = document.all.WebOffice1.GetTempFilePath();
//把字符串保存为临时文件
var vBase64 = "<%=FileData%>"
document.all.WebOffice1.SaveBinaryFileFromBase64(vTempFile ,vBase64 );
//调用接口,打开文件即可
4. WebOffice返回文件的数据流,调用程序负责传递数据,一般用于C/S开发模式
VARIANT GetFileBinary(LPCTSTR strFilePath)
帖子: 10
注册: 2010-07-12 10:39
由 hangel » 2010-07-12 11:44
Weboffice具有全屏显示的功能,单击“全屏”,word文档会全屏显示在屏幕上,单击右上角的“返回”则可以返回原来的模式,如下图所示:
10042915429102f0ccbf84212d.jpg
Weboffice支持VBA编程,在使用js调用weboffice的接口获取VBA对象,同过VBA对象可以使用VBA编程对word文档进行编辑,具体的操作如下:
var obj=document.getElementById(“webOffice1”).GetDocumentObject();
使用obj就可用调用word的VBA接口,从而对word进行操作。
您没有权限查看这个主题的附件。