Как загрузить файл в sharepoint

Обновлено: 04.07.2024

Я создаю некоторые большие файлы (экспорт БД) с Java, и мне нужно поместить их где-нибудь на нашем сервере SharePoint. Прямо сейчас, я делаю это с IE, но я хотел бы автоматизировать этот процесс.

Я искал в интернете, и я нашел некоторые подсказки, чтобы использовать мыло, но я на самом деле не вижу основы всего этого, пока. Может ли кто-нибудь предоставить мне образец кода или рецепт, что мне нужно сделать?

обратите внимание: сервер SharePoint запрашивает проверку подлинности домена NT. Я даже не могу войти с Firefox :(

редактировать

все, что сказал, первый вариант Саша (отображение библиотеки документов на диск), вероятно, самый простой способ, предполагающий, что вы можете обойти проблемы NTLM.

если вы используете Windows, вы можете просто перейти к пути UNC для библиотеки документов. Например, если URL-адрес браузера для библиотеки документов:

вы можете просто ввести соответствующий путь UNC в адресной строке проводника Windows:

а затем перетащите файлы на это местоположение. Если вы хотите, вы можете сопоставить это местоположение с буквой диска с помощью Проводника Windows или SUBST.EXE утилита командной строки.

ОК . после нескольких часов работы и кусая себя через "документацию" MicroSoft предоставляет и все подсказки случайным образом распространяются по сети, мне удалось написать некоторый пример кода для просмотра содержимого SharePoint server:Перемещение По Папкам SharePoint С Помощью Axis2.

Следующая остановка: загрузка чего-то.

и разрешить аутентификацию NTLMv2 вам нужно JCIF библиотека.

Я могу думать о различных вариантах:

. и для части аутентификации NTLM:

Я думаю, что мой подход может помочь вам.

поскольку я использовал аутентификацию OAUTH2, код для получения маркера доступа помогает для другого CRUD оперативный.

как только мы получим токен доступа, мы можем загрузить, используя следующий метод:

мне удалось загрузить файлы в sharepoint с помощью этого кода, используя встроенную идентификацию Windows, возможно, это помогает.

Описание задачи 1. Сохранить копию файла на компьютер.

image

Действия: Выделяем файл и нажимаем Загрузить копию. После этого появится строка загрузки. Она будет различной в зависимости от используемого вами браузера. В Internet Explorer 9 она будет выглядеть как на рисунке ниже. Нажимаем на Save; выбираем Save as и указываем, куда сохранить файл и еще раз нажимаем Save. После этого файл будет сохранен к вам на компьютер.

image

Рис. 101 Строка загрузки файла Internet Explorer 9

Описание задачи 2. Скопировать файл в другую библиотеку и поддерживать копию в актуальном состоянии. Например, ваш босс собирает отчеты о выполнении работ. Его не интересует, что вы для этого используете и что еще хранится у вас в библиотеке. Ему важно иметь отчет к определенной дате. Возникает вопрос, хранить ли все отчеты в библиотеке «Все отчеты» у босса или же иметь свою библиотеку «Мои отчеты» и пересылать файл по почте? Ни один из вариантов не выглядит удобно.

Действия: Не всегда удобно ради одного файла ходить в другую библиотеку. Поэтому есть другой путь. У вас уже есть файл с отчетом. Он хранится в вашей библиотеке «Мои отчеты». Для того, чтобы передать его боссу, сохраним копию файла у него в библиотеке «Все отчеты», но сделаем это через интерфейс SharePoint.

Важно. Почему просто не скопировать файл на компьютер и не загрузить его копию в другую библиотеку?

Описание задачи 3. Как сохранить копию файла в другом расположении

image

Это простое консольное приложение созданное с помощью Visual Studio 2017, которое работает со следующими версиями SharePoint:

  • SharePoint 2013
  • SharePoint 2016
  • SharePoint 2019
  • SharePoint Online

Теоретически должно работать и с SharePoint 2010. Я не проверял - нет под рукой разработческого SharePoint.

Консольное приложение

Новое приложение в Visual Studio

Новое приложение в Visual Studio

После того как приложение создано необходимо добавить ссылки на сборки для работы с SharePoint.

Существуют как минимум два способы сделать это:

Добавить ссылку на существующую сборку Microsoft.SharePoint.Client.dll, которая расположена в папке %ProgramFiles%\Common Files\Microsoft Shared\web server extensions**<15|16>**\ISAPI (если есть установленный SharePoint).

Второй способ - добавление nuget-пакета, выпущенного компанией Microsoft.

В демонстрационном проекте я использовал NuGet.

NuGet Пакет

Чтобы установить пакет Microsoft.SharePointOnline.CSOM, который содержит CSOM-библиотеки как для SharePoint, так и для Project Server/Online, просто выполните следующую команду в консоле управления пакетами:

Всё необходимое есть, теперь можно создавать код.

ClientContext

Для работы с SharePoint с помощью CSOM необходимо инициализировать объект ClientContext:

Перед тем как выполнять какие-либо операции необходимо предоставить учетные данные.

Учетные данные в ClientContext

Свойство Credentials должно быть представлено объектом, который реализует интерфейс ICredential:

Интерфейс ICredential

Таких классов несколько:

Классы, реализующие интерфейс

Классы, реализующие интерфейс ICredential

Используйте класс SharePointOnlineCredentials для работы с SharePoint Online и NetworkCredential в остальных случаях.

Если Вы попробуете использовать SharePointOnlineCredentials для работы с on-premise SharePoint, то будет выброшено такое исключение:

Microsoft.SharePoint.Client.ClientRequestException: The IDCRL response header from server '' is not valid. The response header value is 'NTLM'. The response status code is 'Unauthorized'. All response headers are 'SPRequestDuration=3, SPIisLatency=0, MicrosoftSharePointTeamServices=16.0.0.10711: 1; RequireReadOnly, Content-Length=16, Content-Type=text/plain; charset=utf-8, Date=Fri, 27 Jul 2018 14:53:07 GMT, Server=Microsoft-IIS/10.0, WWW-Authenticate=NTLM, X-Powered-By=nosniff'.

В консольном приложении, в случае если SharePointOnlineCredentials не сработал (значит мы работаем с on-premise SharePoint), то свойство Credentials заменяется на объект типа NetworkCredential:

Теперь приложение будет работать как с on-premise SharePoint, так и с SharePoint Online (или Project Online).

Документ

Документ генерируется при исполнении приложения в памяти. Это простой текстовый файл:

Загрузка документы

Для загрузки необходимо инициализировать объект типа FileCreationInformation:

Это был первый способ и у него есть ограничение: максимальный размер файла 2 МБ. Если файл больше двух мегабайт, то получим исключение:

Microsoft.SharePoint.Client.ServerException: 'The request message is too big. The server does not allow messages larger than 2097152 bytes.'

Для этого есть второй способ загрузить документ.

Загрузка большого документа

Для больших файлов существует метод SaveBinaryDirect класса Microsoft.SharePoint.Client.File:

Даже если загружаемый документ слишком большой - есть выход в CSOM.

Загрузка документа по частям

Для загрузки файла по частям существует набор методов в классе Microsoft.SharePoint.Client.File:

  • StartUpload
  • ContinueUpload
  • FinishUpload
  • CancelUpload

Начинаем загрузку с помощью метода StartUpload, затем продолжаем загрузку с помощью метода ContinueUpload и завершаем загрузку вызовом метода FinishUpload. Если необходимо прервать загрузку - вызываем метод CancelUpload.

Сначала создаем пустой файл и только после этого начинаем загрузку его контента:

При разработке SharePoint-решений часто стоит задача, помимо автоматического разворачивания структуры сайта (поля, типы контента, списки), также и наполнять его базовым контентом. Это могут быть, в основном, списки со справочной информацией. Но, помимо этого, может возникунть потребность наполнить их какими-то тестовыми данными, чтобы провести тестирование решения, в том числе и нагрузочного.

Есть способ наполнить списки данными, указывая их в XML файле к ListInstance. Но такой подход менее удобен, чем рассматриваемый в статье. ListDefinitions не всегда практично использовать для создания списков, кроме того может возникнуть потребность наполнить списки, которые уже существуют на сайте, а не разворачиваются из решения.

Итак, идея заключается в следующей логике:

создание таблиц с данными в Excel,
экспорт данных из Excel в XML,
добавление XML файлов в проект Visual Studio,
парсинг XML содержимого файлов и добавление данных в списки в ресивере фичи на активацию.
Использовать Excel довольно-таки удобно. Во-первых, данные там легко наполнять; можно создавать копии разных строк, просто протянув их мышкой; можно писать разные формулы, чтобы придать значениям рандомности в целях тестирования и т.д. И самое главное — именно в таком виде справочную информацию обычно присылает заказчик, то есть подготоить информацию по вашему запросу в Excel ему будет намного проще.

1. Создайте в Excel-книге на отдельном листе таблицу с данными.

2. Создайте файл .xsd, который будет представлять схему данных, в таком формате:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Currencies">
<xs:complexType>
<xs:sequence>
<xs:element ref="Currency" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Currency">
<xs:complexType>
<xs:sequence>
<xs:element name="Title" type="xs:string"/>
<xs:element name="Currency_IsNational" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

Для удобства называйте корневой элемент так, как называется ваш список на сайте (или как основная часть его адреса). Я называл этот элемент Currencies. При парсинге XML можно будет сразу использовать это название для доступа к нужному списку.

Название полей указывайте в соответствии с InternalName у полей в нужном списке (в примере выше это Title и Currency_IsNational).

Также не смущайтесь, что тип значений стоит «xs:string». При парсинге XML вы все равно будете получать стринговые значения, которые при записи в объект SPListItem сами будут сконвертированы в нужный тип.

Если же вам надо использовать более сложные типы, вроде User, то указывайте в Excel-таблице, к примеру, login name, а в коде выполняйте дополнительную конвертацию в SPFieldUserValue. Далее это будет продемонстрировано.

3. Активируйте вкладку «Разработчик» в экселе.

4. На этой вкладке нажмите кнопку «Источник»:

5. В появившейся панеле нажмите кнопку «Карты XML»:

7. После добавления схемы выделите заголовок таблицы в экселе и нажмите в панеле справа на дереве данных «Сопоставить элемент»:

Таким образом вы сопоставите вашей таблице схему данных. Теперь её можно экспортировать в XML.

8. Нажмите «Экспорт» и сохраните файл .xml:

Экспортированный файл будет выглядеть примерно так:

9.Проделайте описанные выше операции для всех таблиц, которые вы собираетесь загрузить на сайт.

10. Создайте Module в вашем проекте Visual Studio и добавьте в него все .xml фалы с данными, созданными таким образом. Назовите его к примеру InitialData.

Не забудьте включить модуль в фичу.

11. При активации фичи на сайте будет создаваться папка с именем InitialData, куда будут добавлены .xml файлы.

12. Далее в ресивере активации фичи добавьте логику по парсингу этих xml файлов и создании айтемов в нужных списках.

К моменту выполнения этих действий списки уже должны существовать на сайте со всеми необходимыми полями. При этом вы можете наполнять данными списки, в которых уже присутствуют другие данные.

Метод ниже проходит по всем xml файлам в папке InitialData и вызывает метод ImportToSPList для каждого.

public void Import()
// _siteUrl - адрес сайтовой коллекции
using (SPSite site = new SPSite(_siteUrl))
SPWeb web = site.RootWeb;
// _initialDataFolderName - название Модуля (папки, которую он создает)
SPFolder initialDataFolder = web.RootFolder.SubFolders[_initialDataFolderName];

foreach (SPFile file in initialDataFolder.Files)
if (file.Name.EndsWith(".xml", StringComparison.CurrentCultureIgnoreCase))
using (MemoryStream inStream = new MemoryStream(file.OpenBinary()))
using (XmlTextReader reader = new XmlTextReader(inStream))
XmlDocument xd = new XmlDocument();
xd.Load(reader);

В методе ImportToSPList определяется список на основании названия корневого элемента из xml, как я писал выше. Далее для каждого вложенного элемента, который, по сути, преобразовывается в SPListItem, идёт обход по их полям и запись значений в поля SPListItem’а.

private void ImportToSPList(SPWeb web, XmlDocument xd)
XmlElement root = xd.DocumentElement;
// получаем вн. название списка из названия корневого элемента
string rootName = root.LocalName;
string listUrl = String.Format("Lists//AllItems.aspx", rootName);
SPList list = web.GetListFromUrl(listUrl);

Вот сам класс DataImportSpecialRule, который хранит в себе адрес списка, название поля и функцию для конвертации:

public delegate object GetTypedValue(SPWeb web, string value);

class DataImportSpecialRule
public string ListUrl < get; set; >
public string FieldName < get; set; >
public GetTypedValue Converter < get; set; >
>
Функция имеет сигнатуру, описанную в делегате GetTypedValue. На вход она принимает SPWeb и стринговое значение, а возвращает объект, который должен быть записан в поле SPListItem’а.

Изначально вы можете описать все правила, которые должны быть применены ко всем вашим справочникам, так, как показано в примере:

_diSpecialRules = new List()
new DataImportSpecialRule()
<
ListUrl = "Lists/BusinessBlocks/AllItems.aspx",
FieldName = "BusinessBlock_Group",
Converter = (SPWeb web, string value) =>
SPGroup group = web.SiteGroups[value];
return new SPFieldUserValue(web, group.ID, group.Name);
>
>
// тут добавляются другие правила
>;

Как вы видите, в данном правиле происходит описание того, как значение из xml файла, содержащее только название группы, будет записано в поле SPListItem корректным образом.

Для наглядности вот еще один пример конвертера. Он выдаёт значения для поля с множественным выбором. При этом ожидается, что в эксель-таблице такие значения будут записаны через точку с запятой.

private SPFieldMultiChoiceValue MultiChoiceConverter(SPWeb web, string value)
SPFieldMultiChoiceValue fValue = new SPFieldMultiChoiceValue();
foreach (string choice in value.Split(';')) fValue.Add(choice.Trim());
return fValue;
>

Вы можете изменить разделитель, дописать другие правила. В статье приводится лишь концепция и примеры, как это можно легко сделать.

Таким образом, у вас будет эксель-книга, содержащая таблицы с данными. В любой момент, как только эти данные будут изменены или актуализированы, вы несколькими кликами мышки экспорируете таблицу в xml файл, закидываете в проект, и еще одним кликом мышки передеплоиваете решение.
Рутинная работа сведена к минимуму и наполнение справочников происходит автоматически по отлаженной схеме.

Читайте также: