zoukankan      html  css  js  c++  java
  • 关于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

     

    这样的话IE打开这个文档时就会以匿名用户访问这个文档,不会再弹出用户验证框。

    2.在服务器端写IHttpHandler的处理.

    代码
    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验证的步骤。

  • 相关阅读:
    django虚拟环境中报E: 无法定位软件包 sqliteman
    创建django项目
    Django虚拟环境安装
    python学习笔记(三)
    python学习笔记(二)
    python学习笔记(一)
    python 类属性和实例属性
    决策树的基本ID3算法
    KNN算法的简单实现
    webClient
  • 原文地址:https://www.cnblogs.com/poissonnotes/p/1827210.html
Copyright © 2011-2022 走看看