从文档库中获取文件名

时间:2015-04-17 12:56:12

标签: javascript sharepoint sharepoint-2013 client-object-model sharepoint-clientobject

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

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

我正在使用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());
}

2 个答案:

答案 0 :(得分:0)

由于您使用的是JavaScript,我建议您向SharePoint REST API发出GET个请求,以获取所需的信息。

您只需向

发出请求即可访问您的文档库及其文件夹

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打印到控制台。根据您要对网址执行的操作,您必须在那里编写自定义代码。

如果您想进一步探索REST API,可以参考MSDN - Files and folders REST API reference

答案 1 :(得分: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());
   });