【问题标题】:How to get the Absolute URL of a file in sharepoint library如何获取共享点库中文件的绝对 URL
【发布时间】:2011-07-10 03:57:31
【问题描述】:

我正在使用 SharePoint 2010。我在该库中有一个文档库 ID 和文档 ID。我没有包含文档库的网站。所以现在我必须获取完整 URL运行时的文档。我怎样才能得到它。 我尝试了以下方法。

string filepath = currentList.DefaultViewUrl + "/" + sListItem.Url;

请回答。

【问题讨论】:

    标签: sharepoint url sharepoint-2010 document-library


    【解决方案1】:

    使用以下代码获取文件的绝对 URL:

    SPFile file;    
    string url = file.Item[SPBuiltInFieldId.EncodedAbsUrl] as string;
    

    【讨论】:

      【解决方案2】:

      内置字段 id 肯定是最好的方法,但它返回编码后的 Url,这可能是也可能不是你想要的。

      我认为最好的方法是在某处的实用程序类中添加一点扩展方法:

      public static string AbsoluteUrl(this SPFile File, bool Decode = true)
      {
          string EncodedUrl = File.Item[SPBuiltInFieldId.EncodedAbsUrl].ToString();
          if (Decode)
              return SPEncode.UrlDecodeAsUrl(EncodedUrl);
          else
              return EncodedUrl;
      }
      

      然后调用如下

      Item.File.AbsoluteUrl();
      

      如果你想要一个解码的 URL 或

      Item.File.AbsoluteUrl(false);
      

      如果您希望 URL 保持编码状态。

      请注意,Decode 的默认参数值仅适用于 .Net4+,因此仅适用于 SP2013,但您可以轻松地为 SP2010 创建重载方法。您还需要对 Microsoft.SharePoint.Utilities 命名空间的引用才能访问 SPEncode 类。

      【讨论】:

        【解决方案3】:

        不管怎样,访问 item.Web 属性意味着您实际上是在实例化 SPWeb 对象,这意味着应该处理它,否则会导致内存泄漏。
        当已经提到了更好更快的方法时,这是很多开销。

        我会使用提到的BuiltInFieldId.EncodedAbsUrl 方法,因为这样可以最轻松地访问所需内容。

        【讨论】:

          【解决方案4】:
          public string GetItemURL(SPListItem item)
              {
                  string web = item.Web.Url;
                  string listID = item.ParentList.ID.ToString();
                  string contentType = item.ContentTypeId.ToString();
                  string itemID = item.ID.ToString();
                  string url = web+"/_layouts/listform.aspx?PageType=4&ListID={"+listID+"}&ID="+itemID+"&ContentTypeID="+contentType;
                  return url;
              }
          

          它对我有用。希望我能帮助(列表项网址)

          【讨论】:

          • 这可行,但它会带入“文件属性”视图。
          【解决方案5】:

          如果这是用于文档库的,试试这个。

          item.Web.Url+"/"+item.File.Url
          

          【讨论】:

            【解决方案6】:

            使用SPListItem 上的“EncodedAbsUrl”字段。也适用于SPFile

            SPListItem item = ...;
            string absUrl = (string) item[SPBuiltInFieldId.EncodedAbsUrl];
            

            SPFile

             SPFile file = ...;
             string absUrl = (string) file.Item[SPBuiltInFieldId.EncodedAbsUrl];
            

            【讨论】:

            • 如果它对您有帮助,请接受这个答案!这对你有好处(提高你的评分),对给出正确答案的人有好处(更多声誉)!
            • 嗨 Jason,我认为您必须将第二行转换为 string absurl = (string)item[spbuiltinfieldid.Encodedurl];
            • 我以前不知道 SPBuiltInFieldId,这很有帮助,谢谢 Stefan。
            • 如果原始 URL 包含一些像变音符号这样的 Unicode 字符,那么它没有被编码,我们可以做一个解码-编码操作: var encodedUrl = file.Item[SPBuiltInFieldId.EncodedAbsUrl] as string; var decodedUrl = SPEncode.UrlDecodeAsUrl(encodedUrl); encodedUrl = Uri.EscapeUriString(decodedUrl);
            • 如何在客户端对象模型 C# 中实现这一点
            【解决方案7】:

            答案是 字符串 url = currentweb.url+"/"+ Listitem.url;

            【讨论】:

            • SPListItem.Url 返回列表项的站点相对 url。由于您将其与 Web url 连接,因此如果 Web 不是网站集的根 Web,您将得到错误的 url。
            • 是的,你是对的。请告诉我子站点的获取方式也谢谢
            【解决方案8】:

            试试这个,

                      using (SPSite ospSite = new SPSite("http://abcd:24931"))
                       {
                          using (SPWeb web = ospSite.OpenWeb("/subsite")
                           {
                           // Get document library collection here and fetch all the document urls
                               SPDocumentLibrary docLib = (SPDocumentLibrary)web.Lists["docu"]; 
            
                            //where docu is my  document library
                            SPListItemCollection items = docLib.Items;
            
                               foreach (SPListItem item in items)
                                {
                                   string url = item.Url;
                                }
                           }
                      }
            

            希望这能让你继续前进。

            【讨论】:

            • 它只给出了网站的相对网址。但我需要绝对网址
            • 在 "abcd:24931" 和 "/subsite" 方面,你已经有了站点 url,所以你可以连接并准备绝对 URL。:)
            猜你喜欢
            • 2017-07-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-01
            • 1970-01-01
            • 2021-08-22
            • 1970-01-01
            • 2018-04-16
            相关资源
            最近更新 更多