关于sharepoint站点中点击word附件弹出用户认证框的解决办法
在sharepoint站点建设中,sharepoint的List有自己的附件添加机制。
不过在实际项目中,可能不用sharepoint自己的附件添加。
而是自己设计一套附件上传添加,比如把附件添加至自己设计的一套文档库
上图的DocLibLink就是自己设计用于存储附件的文档库
这样的话就会有一个问题,就是在IE中访问附件中的word文档的话,IE就会弹出一个用户密码框进行验证。
比如点击某篇文章的附件,
访问诸如http://www.xxx.com.cn/uploadfile/BFA81039-0000-0000-4583-04FB00004C4.doc的这篇文章
在IE中就会出现
按照网上的相关资料,这是因为IE中访问word的话需要向服务器传递用户密码以验证权限,
如果服务器端已经设置了可匿名访问的话,关闭用户密码其实是可以访问相关的附件的。
这样的话中间就多了一个弹出用户密码弹出框的过程。
用户就提出在打开附件时不要弹出用户密码框的要求。
查了一些资料及问了相关这方面的相关人士,解决这个问题可以从两方面入手。
1.可以设置客户端IE设置,
可以在安全设置里面选择“anonymous logon”,默认的时候是“Automatic logon only in Intranet zone”
代码
namespace BA.WebClient.WebCommon
{
class FileHandler : IHttpHandler
{
#region IHttpHandler 成员
public bool IsReusable
{
get { return true; }
}
public static byte[] StreamToBytes(Stream stream)
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
// 设置当前流的位置为流的开始
stream.Seek(0, SeekOrigin.Begin);
return bytes;
}
public void ProcessRequest(HttpContext context)
{
HttpResponse Response = context.Response;
HttpRequest Request = context.Request;
try
{
string FileName = Request.Path;
SPSite siteColl = SPContext.Current.Site;
SPWeb site = SPContext.Current.Web;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite ElevatedsiteColl = new SPSite(siteColl.ID))
{
using (SPWeb web = ElevatedsiteColl.OpenWeb(site.ID))
{
SPFile file = web.GetFile(FileName);
string FullFileName = HttpContext.Current.Server.MapPath(FileName);
FileInfo DownloadFile = new FileInfo(FullFileName);
if (file.Exists)
{
System.IO.Stream sourceStream = file.OpenBinaryStream();
byte[] buffer = new byte[1024];
buffer = StreamToBytes(sourceStream);
Response.Clear();
Response.ClearHeaders();
Response.Buffer = false;
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(web.Url + file.ServerRelativeUrl, System.Text.Encoding.ASCII));
Response.AppendHeader("Content-Length", file.Length.ToString());
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.Flush();
Response.End();
}
else if (DownloadFile.Exists)
{
Response.Clear();
Response.ClearHeaders();
Response.Buffer = false;
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.ASCII));
Response.AppendHeader("Content-Length", DownloadFile.Length.ToString());
Response.WriteFile(DownloadFile.FullName);
Response.Flush();
Response.End();
}
else
{
//文件不存在
}
}
}
});
}
catch (Exception ex)
{
//打开时异常了
throw ex;
}
}
#endregion
}
}
然后在网站的web.config加入代码
<add verb="GET" path="*.doc" type="BA.WebClient.WebCommon.FileHandler, BA.WebClient.WebCommon"/>
让所有对doc文档的处理方式都以上述代码方式处理。
其实上述代码的意思就是说把doc文档写入到文件流中,然后输出此文件流,从而避免了在IE中直接打开doc文档,
从而就免去了IE验证的步骤。