Работа с папками и файлами в службе REST
Примечание.
Примеры, приведенные на этой странице, не поддерживают символы % и #. Поддержка символов % и # в именах файлов и папок с помощью API ResourcePath
Совет
Служба REST в SharePoint Online (а также локальной среде SharePoint 2016 или более поздней версии) поддерживает объединение нескольких запросов в один вызов службы с помощью параметра запроса OData $batch
. Подробные сведения и ссылки на примеры кода см. в статье Отправка пакетных запросов с помощью интерфейсов REST API.
Работа с папками при помощи REST
Вы можете получить папку в библиотеке документов, если знаете ее URL-адрес. Например, можно получить корневую папку библиотеки Shared Documents, используя в следующем примере конечную точку.
GET https://{site_url}/_api/web/GetFolderByServerRelativeUrl('/Shared Documents')
Authorization: "Bearer " + accessToken
Accept: "application/json;odata=verbose"
Ниже показан пример свойств папки, которые возвращаются при запросе типа контента XML.
<content type="application/xml">
<m:properties>
<d:ItemCount m:type="Edm.Int32">0</d:ItemCount>
<d:Name>Shared Documents</d:Name>
<d:ServerRelativeUrl>/Shared Documents</d:ServerRelativeUrl>
<d:WelcomePage/>
</m:properties>
</content>
В приведенном ниже примере показано, как создать папку.
POST https://{site_url}/_api/web/folders
Authorization: "Bearer " + accessToken
Accept: "application/json;odata=verbose"
Content-Type: "application/json"
Content-Length: {length of request body as integer}
X-RequestDigest: "{form_digest_value}"
{
"__metadata": {
"type": "SP.Folder"
},
"ServerRelativeUrl": "/document library relative url/folder name"
}
В приведенном ниже примере показано, как переименовать папку, используя метод MERGE.
Сначала получите тип OData папки с помощью запроса GET.
GET https://{site_url}/_api/web/GetFolderByServerRelativeUrl('/Folder Name')/ListItemAllFields
Authorization: "Bearer " + accessToken
Accept: "application/json;odata=verbose"
В результате получите значение odata.type
, например SP.Data.Shared_x0020_DocumentsItem
(значение может отличаться в зависимости от конфигурации вашей библиотеки). Затем отправьте запрос MERGE:
POST https://{site_url}/_api/web/GetFolderByServerRelativeUrl('/Folder Name')/ListItemAllFields
Authorization: "Bearer " + accessToken
Accept: "application/json;odata=verbose"
Content-Type: "application/json"
Content-Length: {length of request body as integer}
If-Match: "{etag or *}"
X-HTTP-Method: "MERGE"
X-RequestDigest: "{form_digest_value}"
{
"__metadata": {
"type": "{odata.type from previous call}"
},
"Title": "New name",
"FileLeafRef": "New name"
}
В приведенном ниже примере показано, как удалить папку.
POST https://{site_url}/_api/web/GetFolderByServerRelativeUrl('/Folder Name')
Authorization: "Bearer " + accessToken
If-Match: "{etag or *}"
X-HTTP-Method: "DELETE"
X-RequestDigest: "{form_digest_value}"
Работа с файлами при помощи REST
В приведенном ниже примере показано, как получить все файлы в папке.
GET https://{site_url}/_api/web/GetFolderByServerRelativeUrl('/Folder Name')/Files
method: GET
Authorization: "Bearer " + accessToken
Accept: "application/json;odata=verbose"
В приведенном ниже примере показано, как получить определенный файл.
GET https://{site_url}/_api/web/GetFolderByServerRelativeUrl('/Folder Name')/Files('{file_name}')/$value
Authorization: "Bearer " + accessToken
Вы также можете получить файл, если знаете его URL-адрес, как показано в следующем примере.
GET https://{site_url}/_api/web/GetFileByServerRelativeUrl('/Folder Name/{file_name}')/$value
Authorization: "Bearer " + accessToken
В следующем примере кода показано, как получить файл, когда вы знаете его URL-адрес, используя указанную выше конечную точку REST и C#.
/// <summary>
/// Download File Via Rest API
/// </summary>
/// <param name="webUrl">https://xxxxx/sites/DevSite</param>
/// <param name="credentials"></param>
/// <param name="documentLibName">MyDocumentLibrary</param>
/// <param name="fileName">test.docx</param>
/// <param name="path">C:\\</param>
public static void DownloadFileViaRestAPI(string webUrl, ICredentials credentials, string documentLibName, string fileName, string path)
{
webUrl = webUrl.EndsWith("/") ? webUrl.Substring(0, webUrl.Length - 1) : webUrl;
string webRelativeUrl = null;
if (webUrl.Split('/').Length > 3)
{
webRelativeUrl = "/" + webUrl.Split(new char[] { '/' }, 4)[3];
}
else
{
webRelativeUrl = "";
}
using (WebClient client = new WebClient())
{
client.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
client.Credentials = credentials;
Uri endpointUri = new Uri(webUrl + "/_api/web/GetFileByServerRelativeUrl('" + webRelativeUrl + "/" + documentLibName + "/" + fileName + "')/$value");
byte[] data = client.DownloadData(endpointUri);
FileStream outputStream = new FileStream(path + fileName, FileMode.OpenOrCreate | FileMode.Append, FileAccess.Write, FileShare.None);
outputStream.Write(data, 0, data.Length);
outputStream.Flush(true);
outputStream.Close();
}
}
static void Main(string[] args)
{
string siteURL = "https://xxxxx/sites/DevSite";
//set credential of SharePoint online
SecureString secureString = new SecureString();
foreach (char c in "Password".ToCharArray())
{
secureString.AppendChar(c);
}
ICredentials credentials = new SharePointOnlineCredentials("xxxxxx.onmicrosoft.com", secureString);
//set credential of SharePoint 2013(On-Premises)
//string userName = "Administrator";
//string password = "xxxxxxx";
//string domain = "CONTOSO";
//ICredentials credentials = new NetworkCredential(userName, password, domain);
DownloadFileViaRestAPI(siteURL, credentials, "MyDocumentLib", "test.docx", "c:\\");
Console.WriteLine("success");
Console.ReadLine();
}
В приведенном ниже примере показано, как создать файл и добавить его в папку.
POST https://{site_url}/_api/web/GetFolderByServerRelativeUrl('/Folder Name')/Files/add(url='a.txt',overwrite=true)
Authorization: "Bearer " + accessToken
Content-Length: {length of request body as integer}
X-RequestDigest: "{form_digest_value}"
"Contents of file"
В приведенном ниже примере показано, как обновить файл, используя метод PUT.
Примечание.
PUT является единственным методом, который можно использовать для обновления файла. Метод MERGE не разрешен.
POST https://{site_url}/_api/web/GetFileByServerRelativeUrl('/Folder Name/{file_name}')/$value
Authorization: "Bearer " + accessToken
Content-Length: {length of request body as integer}
X-HTTP-Method: "PUT"
X-RequestDigest: "{form_digest_value}"
"Contents of file"
Если вы хотите обновить метаданные файла, необходимо создать конечную точку, которая получает файл как элемент списка. Это возможно, так как каждая папка также является списком, а каждый файл — элементом списка. Создайте такую конечную точку: https://{site_url}/_api/web/lists/getbytitle('Documents')/items({item_id})
. Информацию о том, как обновить метаданные элемента списка, см. в статье Работа со списками и элементами списков в службе REST.
Извлеките файл, чтобы никто не смог его изменить, прежде чем вы обновите его. После обновления файл необходимо вернуть, чтобы другие пользователи могли с ним работать.
В приведенном ниже примере показано, как извлечь файл.
POST https://{site_url}/_api/web/GetFileByServerRelativeUrl('/Folder Name/{file_name}')/CheckOut(),
Authorization: "Bearer " + accessToken
X-RequestDigest: "{form_digest_value}"
В приведенном ниже примере показано, как вернуть файл.
POST https://{site_url}/_api/web/GetFileByServerRelativeUrl('/Folder Name/{file_name}')/CheckIn(comment='Comment',checkintype=0)
Authorization: "Bearer " + accessToken
X-RequestDigest: "{form_digest_value}"
В приведенном ниже примере показано, как удалить файл.
POST https://{site_url}/_api/web/GetFileByServerRelativeUrl('/Folder Name/{file_name}')
Authorization: "Bearer " + accessToken
If-Match: "{etag or *}"
X-HTTP-Method: "DELETE"
X-RequestDigest: "{form_digest_value}"
Работа с большими файлами при помощи REST
Отправить двоичный файл размером более 1,5 МБ можно только с помощью интерфейса REST. Пример кода для отправки двоичного файла размером менее 1,5 МБ с помощью объектной модели JavaScript SharePoint см. в статье Выполнение базовых операций с использованием кода библиотеки JavaScript в SharePoint. Максимальный размер двоичного файла, который можно создать с помощью REST, составляет 2 ГБ.
В приведенном ниже примере показано, как создать большой двоичный файл.
Предупреждение
Этот способ работает только в Internet Explorer 10 и последних версиях других браузеров.
POST https://{site_url}/_api/web/GetFolderByServerRelativeUrl('/Folder Name')/Files/Add(url='{file_name}', overwrite=true)
Authorization: "Bearer " + accessToken
Content-Length: {length of request body as integer}
X-RequestDigest: "{form_digest_value}"
Contents of binary file
В следующем примере кода показано, как создать файл с помощью этой конечной точки REST и междоменной библиотеки JSOM.
function uploadFileBinary() {
XDomainTestHelper.clearLog();
var requestExecutor;
if (document.getElementById("TxtViaUrl").value.length > 0) {
requestExecutor = new SP.RequestExecutor(document.getElementById("TxtWebUrl").value, document.getElementById("TxtViaUrl").value);
}
else {
requestExecutor = new SP.RequestExecutor(document.getElementById("TxtWebUrl").value);
}
var body = "";
for (var i = 0; i < 1000; i++) {
var ch = i % 256;
body = body + String.fromCharCode(ch);
}
var info = {
url: "_api/web/lists/getByTitle('Shared Documents')/RootFolder/Files/Add(url='a.dat', overwrite=true)",
method: "POST",
binaryStringRequestBody: true,
body: body,
success: success,
error: fail,
state: "Update"
};
requestExecutor.executeAsync(info);
}
Работа со вложенными в элементы списка файлами при помощи REST
В приведенном ниже примере показано, как получить все файлы, вложенные в элемент списка.
GET https://{site_url}/_api/web/lists/getbytitle('{list_title}')/items({item_id})/AttachmentFiles/
Authorization: "Bearer " + accessToken
Accept: "application/json;odata=verbose"
В приведенном ниже примере показано, как получить файл, вложенный в элемент списка.
GET https://{site_url}/_api/web/lists/getbytitle('{list_title}')/items({item_id})/AttachmentFiles('{file_name}')/$value
Authorization: "Bearer " + accessToken
Accept: "application/json;odata=verbose"
В приведенном ниже примере показано, как создать вложение в элемент списка.
POST https://{site_url}/_api/web/lists/getbytitle('{list_title}')/items({item_id})/AttachmentFiles/ add(FileName='{file_name}')
Authorization: "Bearer " + accessToken
Content-Length: {length of request body as integer}
X-RequestDigest: "{form_digest_value}"
"Contents of file"
В приведенном ниже примере показано, как заменить вложенный файл на элемент списка с помощью метода PUT.
Примечание.
PUT является единственным методом, который можно использовать для обновления файла. Метод MERGE не разрешен.
POST https://{site_url}/_api/web/lists/getbytitle('{list_title}')/items({item_id})/AttachmentFiles('{file_name}')/$value
Authorization: "Bearer " + accessToken
Content-Length: {length of request body as integer}
X-HTTP-Method: "PUT"
X-RequestDigest: "{form_digest_value}"
"Contents of file"
См. также
- Знакомство со службой REST в SharePoint
- Выполнение базовых операций с использованием кода библиотеки клиента в SharePoint
- Отправка файла с помощью REST API и jQuery
- SharePoint-Add-in-REST-OData-BasicDataOperations
- Безопасный доступ к данным и клиентские объектные модели для надстроек SharePoint
- Работа с внешними данными в SharePoint
- Материалы по OData
- Разработка надстроек SharePoint