[sharepoint]rest api文档库文件上传,下载,拷贝,剪切,删除文件,创建文件夹,修改文件夹属性,删除文件夹,获取文档列表
写在前面
最近对文档库的知识点进行了整理,也就有了这篇文章,当时查找这些接口,并用在实践中,确实废了一些功夫,也为了让更多的人走更少的弯路。
系列文章
WebHttpRequest在sharepoint文档库中的使用
[sharepoint]修改Item或者File的Author和Editor
文件上传
通过rest api上传到sharepoint文档库。
上传文件api
string strApi = "GetFolderByServerRelativeUrl('" + strFileServerRelativeUrl + "')/Files/Add(url='" + strFileName + "',overwrite=true)?$select=Name,ServerRelativeUrl,TimeCreated,TimeLastModified,Exists,Length";
strFileServerRelativeUrl:文件在sharepoint文档库中的相对路径,比如:/server/libdoc11/test/.
strFileName:文件名称。
overwrite:如果文件在文档库中已经存在,是否进行覆盖。
$select:odata查询关键字,进行筛选字段,这里是在文件上传成功后,返回该文件的相关信息。
文件下载
文件下载api
string loadApi = "GetFileByServerRelativeUrl('" + serverRelativeUrl + "')/$value";
serverRelativeUrl:文件的相对路径,比如:/server/libdoc11/test/1.txt
文件拷贝
string strCopyApi = "GetFileByServerRelativeUrl('" + strSourceUrl + "')/copyto(strnewurl='" + strTargetUrl + "',boverwrite=true)";
strSourceUrl:拷贝文件的相对路径,比如:/server/libdoc11/test/1.txt
strTargetUrl:目标路径,比如:比如:/server/libdoc11/test2/1.txt
boverwrite:是否覆盖
文件剪切
string strMoveToApi = "GetFileByServerRelativeUrl('" + strSourceUrl + "')/moveto(newurl='" + strTargetUrl + "',flags=1)";
strSourceUrl:拷贝文件的相对路径,比如:/server/libdoc11/test/1.txt
strTargetUrl:目标路径,比如:比如:/server/libdoc11/test2/1.txt
flags:1是否覆盖
删除文件
删除文件的接口,与获取文件的接口一样,只不过区别在发送的请求不通,一个是get请求,一个是delete请求。
string queryFileApi = "GetFileByServerRelativeUrl('" + serverRelativeUrl + "')";
string strFileApi = "GetFolderByServerRelativeUrl('" + strFileServerRelativeUrl + "')/Files?$filter=Name eq '" + strFileName + "'&$select=Name,ServerRelativeUrl,TimeCreated,TimeLastModified,Exists,Length";
上面两个都是可以得,第二种是使用odata查询$filter关键字进行筛选,文件名称等于要删除的文件名就可以了,并返回删除的文件信息。
获取文档列表
string strFileApi = "GetFolderByServerRelativeUrl('" + strServerRelative + "')/Files?$orderby=TimeCreated desc&$select=Author/Title,ModifiedBy/Title,CheckInComment,Name,ServerRelativeUrl,TimeCreated,TimeLastModified,Exists,Length&$expand=Author/Title,ModifiedBy/Title";
string strFolderApi = "GetFolderByServerRelativeUrl('" + strServerRelative + "')/Folders?$filter=Name ne 'Forms'&$select=Name,ServerRelativeUrl,ItemCount";
上面的是获取某个文档库的文件列表。并返回需要的属性。下面的接口为获取所有的文件夹,当然可以根据传入的相对路径,获取子目录中的所有文件夹,其中Forms为默认隐藏的目录,可以将其过滤掉,这里是筛选所有不文件夹名字不等于Forms的目录。
注意
在返回文件的创建者与编辑者时,需要使用Author/Title,ModifiedBy/Tilte,因为Author与ModifiedBy在sharepoint端是User对象,并且这时候你会发现这样仍不能正确的显示创建者与编辑者,这时候就需要用到odata查询的$expand关键字。
创建文件夹
string strCreateFolderApi = "folders/add('" + serverRelativeUrl + "/" + folderName + "')";
serverRelativeUrl:相对路径,就是要在哪儿创建文件夹。
一个请求辅助类
各个请求请对号入座
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.AngularJs
{
/// <summary>
/// 请求辅助类
/// </summary>
public class RequestHelper
{
private UserInfo _userInfo;
private string _url;
public RequestHelper(string url, UserInfo userInfo)
{
_url = url;
_userInfo = userInfo;
}
/// <summary>
/// 获取站点contextInfo信息
/// </summary>
/// <returns></returns>
public string GetContextinfo()
{
HttpWebRequest contextInfoRequest = null;
HttpWebResponse endpointResponse = null;
StreamReader sr = null;
string strJson = string.Empty;
try
{
//获取contextinfo
contextInfoRequest = (HttpWebRequest)HttpWebRequest.Create(_url + "/_api/contextinfo");
contextInfoRequest.Method = "POST";
contextInfoRequest.Credentials = new NetworkCredential(_userInfo.Itcode, _userInfo.Pwd, _userInfo.Doamin);
contextInfoRequest.Accept = "application/json;odata=verbose";
contextInfoRequest.ContentLength = 0;
using (endpointResponse = (HttpWebResponse)contextInfoRequest.GetResponse())
{
using (sr = new StreamReader(endpointResponse.GetResponseStream(), Encoding.UTF8))
{
strJson = sr.ReadToEnd();
JObject jobj = JObject.Parse(strJson);
return jobj["d"]["GetContextWebInformation"]["FormDigestValue"].ToString();
}
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 创建文件夹
/// </summary>
/// <param name="strName">要创建文件夹的相对路径</param>
/// <returns></returns>
public string CreateFolder(string serverRelativeUrl)
{
string strJson = string.Empty;
Uri hostWebUri = new Uri(_url);
HttpWebResponse response = null;
StreamReader sr = null;
HttpWebRequest request = null;
try
{
string metadata = "{'__metadata': { 'type': 'SP.Folder' },'ServerRelativeUrl':'" + serverRelativeUrl + "'}";
byte[] buffer = Encoding.UTF8.GetBytes(metadata);
request = (HttpWebRequest)HttpWebRequest.Create(_url + "/_api/web/folders");
request.Method = "POST";
request.Credentials = new NetworkCredential(_userInfo.Itcode, _userInfo.Pwd, _userInfo.Doamin);
request.Accept = "application/json;odata=verbose";
request.ContentLength = buffer.Length;
request.ContentType = "application/json;odata=verbose";
request.Headers.Add("X-RequestDigest", this.GetContextinfo());
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(buffer, 0, buffer.Length);
}
using (response = (HttpWebResponse)request.GetResponse())
{
using (sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
strJson = sr.ReadToEnd();
}
}
}
catch (WebException ex)
{
throw ex;
}
return strJson;
}
/// <summary>
/// 修改文件夹
/// </summary>
/// <param name="strAPI"></param>
/// <returns></returns>
public string UpdateFolder(string folderRelativeUrl, string strName)
{
string strJson = string.Empty;
Uri hostWebUri = new Uri(_url);
HttpWebResponse response = null;
StreamReader sr = null;
HttpWebRequest request = null;
try
{
string metadata = "{'__metadata': {'type': 'SP.Folder'},'Name':'" + strName + "','ServerRelativeUrl':'" + folderRelativeUrl + "'}";
byte[] buffer = Encoding.UTF8.GetBytes(metadata);
request = (HttpWebRequest)HttpWebRequest.Create(_url + "/_api/web/GetFolderByServerRelativeUrl('" + folderRelativeUrl + "')");
request.Method = "POST";
request.Credentials = new NetworkCredential(_userInfo.Itcode, _userInfo.Pwd, _userInfo.Doamin);
request.Accept = "application/json;odata=verbose";
request.ContentLength = buffer.Length;
request.ContentType = "application/json;odata=verbose";
request.Headers.Add("IF-MATCH", "*");
request.Headers.Add("X-HTTP-Method", "MERGE");
request.Headers.Add("X-RequestDigest", this.GetContextinfo());
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(buffer, 0, buffer.Length);
}
using (response = (HttpWebResponse)request.GetResponse())
{
using (sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
strJson = sr.ReadToEnd();
}
}
}
catch (WebException ex)
{
throw ex;
}
return strJson;
}
/// <summary>
/// 移除文件
/// </summary>
/// <param name="fileRelativeUrl"></param>
/// <returns></returns>
public string RemoveFile(string fileRelativeUrl)
{
string strJson = string.Empty;
Uri hostWebUri = new Uri(_url);
HttpWebResponse response = null;
StreamReader sr = null;
HttpWebRequest request = null;
try
{
request = (HttpWebRequest)HttpWebRequest.Create(_url + "/_api/web/GetFileByServerRelativeUrl('" + fileRelativeUrl + "')");
request.Method = "POST";
request.Credentials = new NetworkCredential(_userInfo.Itcode, _userInfo.Pwd, _userInfo.Doamin);
request.Accept = "application/json;odata=verbose";
request.ContentLength = 0;
request.ContentType = "application/json;odata=verbose";
request.Headers.Add("IF-MATCH", "*");
request.Headers.Add("X-HTTP-Method", "DELETE");
request.Headers.Add("X-RequestDigest", this.GetContextinfo());
using (response = (HttpWebResponse)request.GetResponse())
{
using (sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
strJson = sr.ReadToEnd();
}
}
}
catch (WebException ex)
{
throw ex;
}
return strJson;
}
/// <summary>
/// 文件移动或者拷贝
/// </summary>
/// <param name="strAPi"></param>
/// <returns></returns>
public string CopyOrMoveTo(string strAPi)
{
string strJson = string.Empty;
Uri hostWebUri = new Uri(_url);
HttpWebResponse response = null;
StreamReader sr = null;
HttpWebRequest request = null;
try
{
request = (HttpWebRequest)HttpWebRequest.Create(_url + "/_api/web/" + strAPi);
request.Method = "POST";
request.Credentials = new NetworkCredential(_userInfo.Itcode, _userInfo.Pwd, _userInfo.Doamin);
request.Accept = "application/json;odata=verbose";
request.ContentLength = 0;
request.ContentType = "application/json;odata=verbose";
using (response = (HttpWebResponse)request.GetResponse())
{
using (sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
strJson = sr.ReadToEnd();
}
}
}
catch (WebException ex)
{
throw ex;
}
return strJson;
}
/// <summary>
/// 上传文件
/// </summary>
/// <param name="strApi"></param>
/// <param name="data"></param>
/// <returns></returns>
public string PostFile(string strApi, byte[] data)
{
string strJson = string.Empty;
Uri hostWebUri = new Uri(_url);
HttpWebResponse fielResponse = null;
StreamReader sr = null;
HttpWebRequest fileRequest = null;
try
{
fileRequest = (HttpWebRequest)HttpWebRequest.Create(_url + "/_api/web/" + strApi);
fileRequest.Method = "POST";
fileRequest.Credentials = new NetworkCredential(_userInfo.Itcode, _userInfo.Pwd, _userInfo.Doamin);
fileRequest.Accept = "application/json;odata=verbose";
fileRequest.ContentLength = data.Length;
fileRequest.Headers.Add("X-RequestDigest", this.GetContextinfo());
using (Stream requestStream = fileRequest.GetRequestStream())
{
requestStream.Write(data, 0, data.Length);
}
using (fielResponse = (HttpWebResponse)fileRequest.GetResponse())
{
using (sr = new StreamReader(fielResponse.GetResponseStream(), Encoding.UTF8))
{
strJson = sr.ReadToEnd();
}
}
}
catch (WebException ex)
{
throw ex;
}
return strJson;
}
/// <summary>
/// 下载文件
/// </summary>
/// <param name="apiUrl">下载文件的api</param>
/// <param name="filePath">在服务端保存的路径</param>
/// <returns></returns>
public void DownLoadFile(string apiUrl, string filePath)
{
byte[] buffer = null;
Uri hostWebUri = new Uri(_url);
try
{
//下载的时候避免重名文件进行覆盖
if (File.Exists(filePath))
{
File.Delete(filePath);
}
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(_url + "/_api/web/" + apiUrl);
request.Method = "GET";
request.Credentials = new NetworkCredential(_userInfo.Itcode, _userInfo.Pwd, _userInfo.Doamin);
request.Accept = "application/json;odata=verbose";
request.ContentType = "application/octet-stream";
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (Stream stream = response.GetResponseStream())
{
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
{
int bufferSize = 1024;
//缓冲
buffer = new byte[bufferSize];
//真实读取的大小
int length = stream.Read(buffer, 0, bufferSize);
while (length > 0)
{
fs.Write(buffer, 0, length);
length = stream.Read(buffer, 0, bufferSize);
}
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// get请求
/// </summary>
/// <returns></returns>
public string RequestGet(string strApi)
{
string strJson = string.Empty;
Uri hostWebUri = new Uri(_url);
HttpWebRequest endpointRequest = null;
HttpWebResponse endpointResponse = null;
StreamReader sr = null;
try
{
strApi = _url + "/_api/web/" + strApi;
endpointRequest = (HttpWebRequest)HttpWebRequest.Create(strApi);
endpointRequest.Credentials = new NetworkCredential(_userInfo.Itcode, _userInfo.Pwd, _userInfo.Doamin);
endpointRequest.Method = "GET";
endpointRequest.Accept = "application/json;odata=verbose";
using (endpointResponse = (HttpWebResponse)endpointRequest.GetResponse())
{
using (sr = new StreamReader(endpointResponse.GetResponseStream(), Encoding.UTF8))
{
strJson = sr.ReadToEnd();
}
}
}
catch (Exception ex)
{
throw ex;
}
return strJson;
}
}
}
其中url为文档库的站点地址,比如文档库DocLib10的地址为Http://www.bb.com/site/DocLib10/AllItems.aspx.则Url为Http://www.bb.com/site/DocLib10。
买一送一接口
最后再奉上一个查询某个文档库信息的接口
string strDocApi = "lists?$filter=((EntityTypeName eq '" + strEntityName + "' or substringof('" + strEntityName + "',DocumentTemplateUrl)) and BaseTemplate eq 101)&$select=Id,EntityTypeName,ParentWebUrl,Title,BaseTemplate";
使用odata查询,文档库的BaseTemplate为101,这样也可以获取所有的文档库列表。
substringof函数为:属性值中包含某个字符串。以该接口为例,DocumentTemplateUrl中包含strEntityName的文档库。
总结
这里将查询到的,以及用到的接口总结在这里。在使用的时候,各种参数导致的请求失败,当时头都大了。而msdn上面大多都是js的,而且没有详细的demo,只能一个个的尝试。通过文档库的rest api对sharepoint中的List,Item也有一个了解,知道一些操作该去怎么实现。使用场景:移动端集成sharepoint。
参考
http://www.cnblogs.com/PurpleTide/archive/2010/12/21/1912395.html
- 博客地址:http://www.cnblogs.com/wolf-sun/
博客版权:如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。
[sharepoint]rest api文档库文件上传,下载,拷贝,剪切,删除文件,创建文件夹,修改文件夹属性,删除文件夹,获取文档列表的更多相关文章
- 转:【专题十一】实现一个基于FTP协议的程序——文件上传下载器
引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...
- 专题十一:实现一个基于FTP协议的程序——文件上传下载器
引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...
- 跟我学SharePoint 2013视频培训课程——怎样创建文档库并上传文档(8)
课程简介 第8天,怎样在SharePoint 2013怎样创建文档库并上传文档. 视频 SharePoint 2013 交流群 41032413
- SpringMVC 文件上传下载
目录 文件上传 MultipartFile对象 文件下载 上传下载示例 pom.xml增加 创建uploadForm.jsp 创建uploadForm2.jsp 创建userInfo.jsp spri ...
- react-native之文件上传下载
目录 文件上传 1.文件选择 2.文件上传 1.FormData对象包装 2.上传示例 文件下载 最近react-native项目上需要做文件上传下载的功能,由于才接触react-native不久,好 ...
- Python接口自动化——文件上传/下载接口
〇.前言 文件上传/下载接口与普通接口类似,但是有细微的区别. 如果需要发送文件到服务器,例如:上传文档.图片.视频等,就需要发送二进制数据,上传文件一般使用的都是 Content-Type: mul ...
- FastDFS实现文件上传下载实战
正好,淘淘商城讲这一块的时候,我又想起来当时老徐让我写过一个关于实现FastDFS实现文件上传下载的使用文档,当时结合我们的ITOO的视频系统和毕业论文系统,整理了一下,有根据网上查到的知识,总结了一 ...
- Java实现FTP批量大文件上传下载篇1
本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...
- java web 文件上传下载
文件上传下载案例: 首先是此案例工程的目录结构:
- WEB文件上传下载功能
WEB文件上传下载在日常工作中经常用到的功能 这里用到JS库 http://files.cnblogs.com/meilibao/ajaxupload.3.5.js 上传代码段(HTML) <% ...
随机推荐
- linux中权限对文件和目录的作用
chmod 755 a.txt 文件: r:读取文件内容(cat more head tail) w:编辑,新增,修改文件的内容(vi,echo) 不包括删除文件:原因是只能对文件内容进行修改,而在l ...
- PHP调用外部命令
------------------------------------------------------------------ 一.PHP调用外部命令总结 ...
- Windows下如何硬盘安装Ubuntu
一般来说,折腾双系统是每一位程序猿都有过的经历,如何在windows下安装双系统ubuntu呢?今天来给大家介绍一下如何直接在windows硬盘安装ubuntu,而不需要使用U盘或者光盘,或外置硬盘. ...
- 蚂蚁爬杆问题 UVA 10881
算法入门经典训练指南上的题. 这里有必要讲一下蚂蚁爬杆问题:每只蚂蚁都有一个初始方向,相撞会转向,关键就是相撞的处理,由于速度并不会改变,两只蚂蚁相撞,可以看做,两只蚂蚁穿过对方,继续沿原方向前进,经 ...
- HDU5992 - Finding Hotels
原题链接 Description 给出个二维平面上的点,每个点有权值.次询问,求所有权值小于等于的点中,距离坐标的欧几里得距离最小的点.如果有多个满足条件的点,输出最靠前的一个. Solution 拿 ...
- 关联规则—频繁项集Apriori算法
频繁模式和对应的关联或相关规则在一定程度上刻画了属性条件与类标号之间的有趣联系,因此将关联规则挖掘用于分类也会产生比较好的效果.关联规则就是在给定训练项集上频繁出现的项集与项集之间的一种紧密的联系.其 ...
- web工程导入新环境的注意事项
问题一:The type java.lang.Object cannot be resolved. 解决办法: 当你在Eclipse引用不同版本JDK工程时会发生该问题.由于你开发环境中应用了多个版本 ...
- java数组:去重,增加,删除元素
import java.util.List; import java.util.ArrayList; import java.util.Set; import java.util.HashSet; p ...
- python函数式编程之装饰器(二)
以前用装饰器,都是定义好了装饰器后,使用@装饰器名的方法写入被装饰函数的正上方 在这里,定义的装饰器都是没有参数的 在定义装饰器的函数的时候,没有在括号里定义参数,这就叫做无参装饰器 既然有无参装饰器 ...
- 关于adb is down 的两个解决方案
在Android开发过程中经常遇到这样的一个问题,The connection to adb is down, and a severe error has occured. 解决方案一: 1.为了以 ...