Лучший отвечающий
Программно добавить файл в библиотеку из стороннего приложения C#

Вопрос
-
Требуется пример с загрузкой файлов(документов Excel) в библиотеку на портале SP(2010) из приложения написанного на С# и запускаемого по расписанию с хоста не имеющего никакого отношения к SharePoint'у.
Нашел один пример в инете, но там требуется подключение библиотеки Microsoft.SharePoint ,но возникла проблема с ее подключением(компилятор не хочет ее находить...ссылку в проект добавил, в GAC добавлял, рядом с ехешником ложил - не помогает).
Спасибо.8 декабря 2014 г. 7:52
Ответы
-
using (SPSite objSite = new SPSite("http://portal/")) { using (SPWeb objWeb = objSite.OpenWeb()) { byte[] byt = System.IO.File.ReadAllBytes(@"C:\doc1.txt"); SPFolder mylibrary = objWeb.Folders["DocLib2"]; // Set AllowUnsafeUpdates = true to avoid security error objWeb.AllowUnsafeUpdates = true; mylibrary.Files.Add(System.IO.Path.GetFileName(@"C:\doc1.txt"), byt); } } Вот немного переделанный код,которыйнашел в сети...меня все устраивает, но проблема с компиляцией(см.выше), как его заставить работать?
Добрый день,
ваш код использует SPSite и SPWeb, а значит это серверный код (выполняется только на сервере с установленным SharePoint), запустить его на других ПК не получится.
Для решения вам необходимо в проект подключить Microsoft.SharePoint.Client и Microsoft.SharePoint.Client.Runtime.
Далее в коде:
ClientContext context = new ClientContext("http://portal"); Web web = context.Web; FileCreationInformation newFile = new FileCreationInformation(); newFile.Content = System.IO.File.ReadAllBytes(@"C:\docs\FileToLoad.docx"); newFile.Url = "FileToLoad.docx"; List docs = web.Lists.GetByTitle("DocumentLibraryTitle"); Microsoft.SharePoint.Client.File uploadFile = docs.RootFolder.Files.Add(newFile); context.Load(uploadFile); context.ExecuteQuery(); Console.WriteLine("Выполнено");
All done.
- Предложено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 9 декабря 2014 г. 6:24
- Помечено в качестве ответа Greedy123 9 декабря 2014 г. 20:07
9 декабря 2014 г. 0:49 -
Спасибо, то что нужно!
Хотел лишь добавить, что так как я использовал этот код в сценарии SSIS пакета(VS 2008), то нужно в свойствах проекта выбирать Framework 3.5 и добавлять эти библиотеки(Microsoft.SharePoint.Client и Microsoft.SharePoint.Client.Runtime) в GAC с помощью gacutil.exe . А для обычного проекта в VS 2010 в качестве целевого Фреймворка нужно выбирать обычный, а не "...Client Profile".
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 10 декабря 2014 г. 6:34
9 декабря 2014 г. 20:21 -
Добрый день,
посмотрите файл web.config и покажите секцию <httpRuntime .... /> с вашими настройками.
File.Add метод загружает файл в Base64 кодировке, поэтому его размер еще более увеличивается.
Попробуйте загрузить файл через WebDAV:
private static void UploadFile(string filePath,ClientContext context, string listTitle) { using (var fs = new FileStream(filePath, FileMode.Open)) { var list = context.Web.Lists.GetByTitle(listTitle); context.Load(list.RootFolder); context.ExecuteQuery(); var fileName = Path.GetFileName(filePath); var fileUrl = String.Format("{0}/{1}", list.RootFolder.ServerRelativeUrl, fileName); Microsoft.SharePoint.Client.File.SaveBinaryDirect(context, fileUrl, fs, true); } } // далее в программе ClientContext context = new ClientContext("http://portal"); UploadFile("C:\docs\FileToLoad.docx", context, "Название списка"); //Done
- Помечено в качестве ответа Greedy123 20 декабря 2014 г. 17:19
19 декабря 2014 г. 1:40
Все ответы
-
Один из простейших вариантов - назначить библиотеке почтовый адрес и отправлять документ вложением: в параметрах библиотеки можно указать сохранять вложения и даже создавать папки по теме письма.
Сазонов Илья http://isazonov.wordpress.com/
8 декабря 2014 г. 9:45Модератор -
using (SPSite objSite = new SPSite("http://portal/")) { using (SPWeb objWeb = objSite.OpenWeb()) { byte[] byt = System.IO.File.ReadAllBytes(@"C:\doc1.txt"); SPFolder mylibrary = objWeb.Folders["DocLib2"]; // Set AllowUnsafeUpdates = true to avoid security error objWeb.AllowUnsafeUpdates = true; mylibrary.Files.Add(System.IO.Path.GetFileName(@"C:\doc1.txt"), byt); } } Вот немного переделанный код,которыйнашел в сети...меня все устраивает, но проблема с компиляцией(см.выше), как его заставить работать?8 декабря 2014 г. 12:30
-
using (SPSite objSite = new SPSite("http://portal/")) { using (SPWeb objWeb = objSite.OpenWeb()) { byte[] byt = System.IO.File.ReadAllBytes(@"C:\doc1.txt"); SPFolder mylibrary = objWeb.Folders["DocLib2"]; // Set AllowUnsafeUpdates = true to avoid security error objWeb.AllowUnsafeUpdates = true; mylibrary.Files.Add(System.IO.Path.GetFileName(@"C:\doc1.txt"), byt); } } Вот немного переделанный код,которыйнашел в сети...меня все устраивает, но проблема с компиляцией(см.выше), как его заставить работать?
Добрый день,
ваш код использует SPSite и SPWeb, а значит это серверный код (выполняется только на сервере с установленным SharePoint), запустить его на других ПК не получится.
Для решения вам необходимо в проект подключить Microsoft.SharePoint.Client и Microsoft.SharePoint.Client.Runtime.
Далее в коде:
ClientContext context = new ClientContext("http://portal"); Web web = context.Web; FileCreationInformation newFile = new FileCreationInformation(); newFile.Content = System.IO.File.ReadAllBytes(@"C:\docs\FileToLoad.docx"); newFile.Url = "FileToLoad.docx"; List docs = web.Lists.GetByTitle("DocumentLibraryTitle"); Microsoft.SharePoint.Client.File uploadFile = docs.RootFolder.Files.Add(newFile); context.Load(uploadFile); context.ExecuteQuery(); Console.WriteLine("Выполнено");
All done.
- Предложено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 9 декабря 2014 г. 6:24
- Помечено в качестве ответа Greedy123 9 декабря 2014 г. 20:07
9 декабря 2014 г. 0:49 -
Спасибо, то что нужно!
Хотел лишь добавить, что так как я использовал этот код в сценарии SSIS пакета(VS 2008), то нужно в свойствах проекта выбирать Framework 3.5 и добавлять эти библиотеки(Microsoft.SharePoint.Client и Microsoft.SharePoint.Client.Runtime) в GAC с помощью gacutil.exe . А для обычного проекта в VS 2010 в качестве целевого Фреймворка нужно выбирать обычный, а не "...Client Profile".
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 10 декабря 2014 г. 6:34
9 декабря 2014 г. 20:21 -
Новая проблема: при загрузке файла размером более 2Мб пишет:
Microsoft.SharePoint.Client.ServerException: Сообщение запроса слишком велико. Сервер не поддерживает сообщения размером больше 2097152 байт.
Нашел похожую тему :
http://support.microsoft.com/kb/2529243/en-us
Это что получается, таким способом файл более 2 Мб загрузить не получится?!
17 декабря 2014 г. 12:37 -
Нет, необходимо просто настроить timeout, подробно отвечу через 7 часов17 декабря 2014 г. 16:09
-
Добрый день,
увеличиваем лимиты:
1. Central Administration -> Manage Web Applications -> Выбираем web application -> General Settings -> Параметр Maximum Upload Size устанавливаем в 2048 - > Ok
2. Увеличиваем RequestLength IIS
%windir%\system32\inetsrv\appcmd set config -section:requestFiltering -requestLimits.maxAllowedContentLength:2147483648
iisreset
3. Увеличиваем ConnectionTimeOut:
Открываем IIS -> Выбираем Web Application -> Advanced Settings -> Connection Limits -> Увеличиваем Connection Time-out (Секунды)
4. Проверяем.
Connection time out еще настраивается на клиентской стороне, если не получится - пишите, будем разбираться (я файлы до 1Гб загружаю, все норм).- Изменено Maxim Shusharin 18 декабря 2014 г. 3:00
- Предложено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 18 декабря 2014 г. 6:52
18 декабря 2014 г. 2:51 -
Администратор SharePoint утверждает, что все настройки соответствуют вышеприведенным рекомендациям(Maximum Upload Size только установлен в 100Мб), но ошибка не исчезла. Кстати, в ручную(со страницы портала) файл нужного размера(25Мб) загружается без ошибок.
ЗЫ: на клиенте установил context.RequestTimeout = 300000; не помогло
18 декабря 2014 г. 12:36 -
Добрый день,
посмотрите файл web.config и покажите секцию <httpRuntime .... /> с вашими настройками.
File.Add метод загружает файл в Base64 кодировке, поэтому его размер еще более увеличивается.
Попробуйте загрузить файл через WebDAV:
private static void UploadFile(string filePath,ClientContext context, string listTitle) { using (var fs = new FileStream(filePath, FileMode.Open)) { var list = context.Web.Lists.GetByTitle(listTitle); context.Load(list.RootFolder); context.ExecuteQuery(); var fileName = Path.GetFileName(filePath); var fileUrl = String.Format("{0}/{1}", list.RootFolder.ServerRelativeUrl, fileName); Microsoft.SharePoint.Client.File.SaveBinaryDirect(context, fileUrl, fs, true); } } // далее в программе ClientContext context = new ClientContext("http://portal"); UploadFile("C:\docs\FileToLoad.docx", context, "Название списка"); //Done
- Помечено в качестве ответа Greedy123 20 декабря 2014 г. 17:19
19 декабря 2014 г. 1:40 -
через WebDAV - всё получилось!
Огромное спасибо!
20 декабря 2014 г. 17:19