none
Программно добавить файл в библиотеку из стороннего приложения C# RRS feed

  • Вопрос

  • Требуется пример с загрузкой файлов(документов 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.

    9 декабря 2014 г. 0:49
  • Спасибо, то что нужно!

    Хотел лишь добавить, что так как я использовал этот код в сценарии SSIS пакета(VS 2008), то нужно в свойствах проекта выбирать Framework 3.5 и добавлять эти библиотеки(Microsoft.SharePoint.Client и Microsoft.SharePoint.Client.Runtime) в GAC с помощью gacutil.exe . А для обычного проекта в VS 2010 в качестве целевого Фреймворка нужно выбирать обычный, а не "...Client Profile".

    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.

    9 декабря 2014 г. 0:49
  • Спасибо, то что нужно!

    Хотел лишь добавить, что так как я использовал этот код в сценарии SSIS пакета(VS 2008), то нужно в свойствах проекта выбирать Framework 3.5 и добавлять эти библиотеки(Microsoft.SharePoint.Client и Microsoft.SharePoint.Client.Runtime) в GAC с помощью gacutil.exe . А для обычного проекта в VS 2010 в качестве целевого Фреймворка нужно выбирать обычный, а не "...Client Profile".

    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Гб загружаю, все норм).
    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