我有一个名为DocLibrary的文档库。在里面,我创建了一些文件夹。每个文件夹有3个其他文件夹。在里面,我存储特定的文件示例:DocLibrary>NF1>Communications,其中DocLibrary是文档库,NF1是DocLibrary内的文件夹,Communications是NF1内的文件夹。
现在,我想提供一个下载链接,指向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());
}
由于您使用的是JavaScript,我建议您向SharePoint REST API发出GET
请求以获取所需信息。
您只需向发出请求,就可以访问您的文档库及其文件夹
http://siteUrl/_api/web/getfolderbyserverrelativeurl('Documents/NF1/Communications')/files?$orderby=TimeLastModified%20desc
如果你在浏览器中导航到上面的URL,用你的网站真实的URL替换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文件和文件夹REST API参考。
一些建议
1) 您可以构造只返回Files并按修改日期排序的查询:
<View>
<Query>
<Where>
<Eq><FieldRef Name="FSObjType" /><Value Type="Integer">0</Value></Eq>
</Where>
<OrderBy>
<FieldRef Name="Modified" Ascending="FALSE" />
</OrderBy>
</Query>
</View>
2) 从性能的角度来看,因为您对File属性感兴趣,所以可以明确指定要检索的属性,例如:
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());
});