如何获取SharePoint库中文件的绝对URL

16

我正在使用SharePoint 2010。我知道一个文档库的ID和其中一个文档的ID,但不知道该文档库所在的网站或站点。现在我需要在运行时获取该文档的完整URL。我已经尝试了以下方法。

string filepath = currentList.DefaultViewUrl + "/" + sListItem.Url;
请回答这个问题。
8个回答

49

SPListItem 上使用字段 "EncodedAbsUrl"。对于 SPFile 也适用:

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

或者对于一个SPFile

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

1
如果这个回答对您有帮助,请接受它!这对您有好处(提高您的评分),也对给出正确答案的人有好处(增加声望)! - Dribbel
嗨,Jason,我认为你必须将第二行转换为字符串absurl =(string)item [spbuiltinfieldid.Encodedurl]; - Tortoise
我之前不知道SPBuiltInFieldId,这对我很有帮助,谢谢 Stefan。 - Marc
如果原始URL包含一些Unicode字符,例如变音符号,则它们未被编码,我们可能需要进行解码和编码操作:var encodedUrl = file.Item[SPBuiltInFieldId.EncodedAbsUrl] as string; var decodedUrl = SPEncode.UrlDecodeAsUrl(encodedUrl); encodedUrl = Uri.EscapeUriString(decodedUrl); - Oleg Savelyev
我如何在客户端对象模型C#中实现这个? - Atish Kumar Dipongkor

3

内置字段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保持编码状态。

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


2

试试这个,

          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;
                    }
               }
          }

希望这能帮助你入门。

它只提供了站点相对URL。但我需要绝对URL。 - Tortoise

2
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;
    }

对我来说它是有效的。希望我能帮到你(列表项URL)


这个可以工作,但它会带到“文件属性”视图。 - alelom

1
如果这是给文档库的话,可以试试这个。
item.Web.Url+"/"+item.File.Url

1
使用以下代码获取文件的绝对URL:
SPFile file;    
string url = file.Item[SPBuiltInFieldId.EncodedAbsUrl] as string;

0

就算是值得的,访问item.Web属性意味着你实际上正在实例化SPWeb对象,这意味着它应该被处理掉,否则会导致内存泄漏。
当已经有更好、更快的方法时,这是很多额外开销。

我会使用提到的BuiltInFieldId.EncodedAbsUrl方法,因为这可以让你最轻松地访问你想要的内容。


-4
答案是 string url = currentweb.url + "/" + Listitem.url;

SPListItem.Url返回列表项的站点相对URL。如果您将其与Web URL连接起来,则会得到错误的URL,如果Web不是站点集的根Web。 - Stefan
是的,你说得对。请告诉我如何在子站点中获取它。谢谢。 - Tortoise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接