2

我有一个名为DocLibrary的文档库。在里面,我创建了几个文件夹。每个文件夹有3个其他文件夹。在里面,我存储了特定的文件。 示例:DocLibrary> NF1> Communications,其中DocLibrary是文档库,NF1是DocLibrary内的文件夹,Communications是NF1内的文件夹。从文档库中获取文件名

现在我想给通讯文件夹中的特定文件的下载链接按修改日期排序。我面临如何转到通讯文件夹,然后选择文件名的问题。

我正在使用java脚本。

现在我正在使用下面的代码。但我对此完全陌生,对如何解决方法的想法有限。请帮助。

function test1() 
{ 
    var context = new SP.ClientContext.get_current(); 
    var web = context.get_web(); 
    var list = web.get_lists().getByTitle('DocLibrary'); 

    var query = SP.CamlQuery.createAllItemsQuery(); 
    query.set_folderServerRelativeUrl('/DocLibrary/NF1/Communications/'); 
    allItems = list.getItems(query); 
    alert('hi'); 
    context.load(allItems); 

    context.executeQueryAsync(Function.createDelegate(this, this.success), Function.createDelegate(this, this.failed)); 
} 

function success() 
{ 
    var fileUrls = ''; 
    var ListEnumerator = this.allItems.getEnumerator(); 
    while(ListEnumerator.moveNext()) 
    { 
     var currentItem = ListEnumerator.get_current(); 
     var _contentType = currentItem.get_contentType(); 
     if(_contentType.get_name() != 'Folder') 
     { 
      var File = currentItem.get_file(); 
      if(File != null) 
      { 
       fileUrls += File.get_serverRelativeUrl() + '\n'; 
      } 
     } 
    } 
    alert(fileUrls); 
} 
function failed(sender, args) { 
    alert('failed. Message:' + args.get_message()); 
} 
+0

只怕不知道这个问题的答案,但文件夹没有存储文件的好方法。查看文档的元数据(即内容类型),以便真正从SharePoint文档管理中受益。 – MattDuFeu

回答

0

既然你使用JavaScript,我建议你做一个GET请求到SharePoint REST API来获得您想要的信息。

您可以访问您的文档库和它的文件夹,只需发出请求到

http://siteUrl/_api/web/getfolderbyserverrelativeurl('Documents/NF1/Communications')/files?$orderby=TimeLastModified%20desc

如果你导航到你的浏览器上面的网址,替换siteUrl与您的网站真实网址,你会以XML格式获得回应。


从JavaScript

注意,此方法需要jQuery的工作请求,否则,你将不得不作出一个XMLHttpRequest到服务器。

要从JavaScript发出请求,$.ajax()非常简单。

$.ajax({ 
    url: _spPageContextInfo.siteAbsoluteUrl + "_api/web/getfolderbyserverrelativeurl('Documents/NF1/Communications')/files?$orderby=TimeLastModified%20desc", 
    type: "GET", 
    headers: { 
     "accept": "application/json;odata=verbose", 
    }, 
    success: function (result) { 
     //Do something with the result here! 
     $.each(result.d.results, function(i, item){ 
      console.log("The URL to the file is: " + item.__metadata.uri); 
     }); 
    }, 
    error: function (error) { 
     //Ouch, an error occured with the request 
     //Don't forget to handle the error in some way! 
    } 
}); 

这将返回您的文件夹,通过现场TimeLastModified,分类,其中一个用最新的修改时间在顶部指数中的所有文件的数组。可以通过数组中每个对象的__metadata.uri属性访问每个文件的URL。

在上面的代码示例中,我使用jQuery $.each()函数遍历所有文件,并将该文件的URL打印到控制台。根据您想要对URL执行的操作,您必须在此处编写自定义代码。如果您想进一步探索REST API,可以参考MSDN - Files and folders REST API reference

0

一些建议

1)你可以构建一个只返回文件的查询和修改日期排序:

<View> 
    <Query> 
    <Where> 
     <Eq><FieldRef Name="FSObjType" /><Value Type="Integer">0</Value></Eq>                                      
    </Where> 
    <OrderBy> 
     <FieldRef Name="Modified" Ascending="FALSE" /> 
    </OrderBy> 
    </Query> 
</View> 

2)从性能的角度来看,因为您有兴趣的文件属性,可以明确指定要检索的属性,例如:

context.load(items,'Include(File.ServerRelativeUrl)'); // retrieve File.ServerRelativeUrl 

修改例

function getFiles(listTitle,folderUrl,success,failed) 
{ 
    var context = SP.ClientContext.get_current(); 
    var web = context.get_web(); 
    var list = web.get_lists().getByTitle(listTitle); 
    var createItemsQuery = function(folderUrl){ 
     var qry = new SP.CamlQuery(); 
     qry.set_viewXml('<View><Query><Where><Eq><FieldRef Name="FSObjType" /><Value Type="Integer">0</Value></Eq></Where><OrderBy><FieldRef Name="Modified" Ascending="FALSE" /></OrderBy></Query></View>'); 
     qry.set_folderServerRelativeUrl(folderUrl); 
     return qry; 
    }; 
    var items = list.getItems(createItemsQuery(folderUrl)); 
    context.load(items,'Include(File.ServerRelativeUrl)'); 
    context.executeQueryAsync(
     function(){ 
      success(items) 
     }, 
     failed); 
} 

使用

var listTitle = 'DocLibrary'; 
var folderUrl = '/DocLibrary/NF1/Communications'; //format: /[site]/[library]/[folder] 
getFiles(listTitle,folderUrl, 
    function(items) 
    { 
     var fileUrls = []; 
     items.get_data().forEach(function(item){ 
      var file = item.get_file(); 
      fileUrls.push(file.get_serverRelativeUrl()); 
     }); 
     var result = fileUrls.join(','); 
     console.log(result); 
    }, 
    function(sender, args) { 
     console.log('Message:' + args.get_message()); 
    });