Подтвердить что ты не робот

Загрузите документ в список SharePoint из клиентской модели объекта

Мне нужно загрузить документ в список SharePoint или папку, используя объектную модель клиента на стороне .NET(С#). Каков наилучший способ сделать это?

Требования следующие:

  • Установить значения метаданных

  • Нет ограничений на размер файла

  • Должно работать с библиотеками, которые превышают порог представления списка.

4b9b3361

Ответ 1

Для загрузки документа в библиотеку документов Sharepoint используйте следующую функцию в клиентской объектной модели:

public void UploadDocument(string siteURL, string documentListName, string documentListURL, string documentName, byte[] documentStream)
{
    using (ClientContext clientContext = new ClientContext(siteURL))
    {
        //Get Document List
        List documentsList = clientContext.Web.Lists.GetByTitle(documentListName);

        var fileCreationInformation = new FileCreationInformation();
        //Assign to content byte[] i.e. documentStream

        fileCreationInformation.Content = documentStream;
        //Allow owerwrite of document

        fileCreationInformation.Overwrite = true;
        //Upload URL

        fileCreationInformation.Url = siteURL + documentListURL + documentName;
        Microsoft.SharePoint.Client.File uploadFile = documentsList.RootFolder.Files.Add(
            fileCreationInformation);

        //Update the metadata for a field having name "DocType"
        uploadFile.ListItemAllFields["DocType"] = "Favourites";

        uploadFile.ListItemAllFields.Update();
        clientContext.ExecuteQuery();
    }
}

Следующая ссылка также полезна для вас 1) http://blogs.msdn.com/b/sridhara/archive/2010/03/12/uploading-files-using-client-object-model-in-sharepoint-2010.aspx

2)http://msdn.microsoft.com/en-us/library/ee956524.aspx

3)http://www.codeproject.com/Articles/103503/How-to-upload-download-a-document-in-SharePoint-20

Ответ 2

Другой способ - использовать метод SaveBinaryDirect. В методе SaveBinaryDirect для загрузки и скачивания файлов используется распределенное создание и ведение веб-публикации (WebDAV). Без создания собственного пользовательского сервиса WCF WebDAV является наиболее эффективным способом загрузки и загрузки файлов.

using (FileStream fs = new FileStream(FileToImport, FileMode.OpenOrCreate))
{
   Microsoft.SharePoint.Client.File.SaveBinaryDirect(context, uri.LocalPath, fs, true);
}
Microsoft.SharePoint.Client.File newFile = web.GetFileByServerRelativeUrl(uri.LocalPath);
context.Load(newFile);
context.ExecuteQuery();

//check out to make sure not to create multiple versions
newFile.CheckOut();

ListItem item = newFile.ListItemAllFields;
item["Created"] = info.SourceFile.CreationTime;
item["Modified"] = info.SourceFile.LastWriteTime;
item.Update();

// use OverwriteCheckIn type to make sure not to create multiple versions 
newFile.CheckIn(string.Empty, CheckinType.OverwriteCheckIn);

Ответ 3

Еще один вариант загрузки файла на сайт SharePoint (включая SharePoint Online) с использованием метода File.SaveBinaryDirect:

/// <summary>
/// Uploads the specified file to a SharePoint site
/// </summary>
/// <param name="context">SharePoint Client Context</param>
/// <param name="listTitle">List Title</param>
/// <param name="fileName">File Name</param>
private static void UploadFile(ClientContext context, string listTitle,string fileName)
{
     using (var fs = new FileStream(fileName, FileMode.Open))
     {
          var fi = new FileInfo(fileName);
          var list = context.Web.Lists.GetByTitle(listTitle);
          context.Load(list.RootFolder);
          context.ExecuteQuery();
          var fileUrl = String.Format("{0}/{1}", list.RootFolder.ServerRelativeUrl, fi.Name);

          Microsoft.SharePoint.Client.File.SaveBinaryDirect(context, fileUrl, fs, true);
      }
  }

Ответ 4

Я обнаружил, что часть сообщения delax, которая обновляет новые атрибуты/столбцы файла, не будет работать, вот еще одна версия, которая даже встраивается в пользовательскую библиотеку infopath с продвинутым полем:

   public string AddNewForm(string WebUrl, string NewTitle)
    {
        string strMsg = "";
        if (string.IsNullOrEmpty(WebUrl))
            return EmptyProcURL;

        try
        {
            // Starting with ClientContext, the constructor requires a URL to the server running SharePoint. 
            using (ClientContext client = new ClientContext(WebUrl))
            {
                //client.Credentials = System.Net.CredentialCache.DefaultCredentials;

                // Assume that the web site has a library named "FormLibrary". 
                var formLib = client.Web.Lists.GetByTitle("FormLibrary");
                client.Load(formLib.RootFolder);
                client.ExecuteQuery();

                // FormTemplate path, The path should be on the local machine/server !
                string fileName = @"D:\Projects\FormTemplate.xml"; 

                var fileUrl = "";

                //Craete FormTemplate and save in the library.
                using (var fs = new FileStream(fileName, FileMode.Open))
                {
                    var fi = new FileInfo("newForm.xml");
                    fileUrl = String.Format("{0}/{1}", formLib.RootFolder.ServerRelativeUrl, fi.Name);
                    Microsoft.SharePoint.Client.File.SaveBinaryDirect(client, fileUrl, fs, true);
                }

                // Get library columns collection.
                var libFields = formLib.Fields;
                client.Load(libFields);
                client.ExecuteQuery();

                Microsoft.SharePoint.Client.File newFile = client.Web.GetFileByServerRelativeUrl(fileUrl);

                ListItem item = newFile.ListItemAllFields;

                // Here the index of Title column is 9, you may use this format to update any column (even promoted fields).
                // To find the index of interested column you should inspect libFields at debug mode, look in the libFields.Fields collection to find the index!
                item[libFields[9].StaticName] = NewTitle ;
                item.Update();
                client.ExecuteQuery();
            }
        }
        catch (Exception ex)
        {
            strMsg = ex.Message;
        }

        return strMsg;
    }

Ответ 5

Я разработал следующий код, он работает нормально.

 static void Main(string[] args)
    {
       try
        { 
         using (ClientContext client = new ClientContext("https://sharepoint2018/sites/demos"))
            {                   
                string passWd = "password";
                SecureString securePassWd = new SecureString();
                foreach (var c in passWd.ToCharArray())
                {
                    securePassWd.AppendChar(c);
                }
                client.Credentials = new SharePointOnlineCredentials("username", securePassWd);
                var formLib = client.Web.Lists.GetByTitle("Documents");
                client.Load(formLib.RootFolder);
                client.ExecuteQuery();
                string fileName = @"C:\demo.txt";  // FilePath
                var fileUrl = "";  
                using (var fs = new FileStream(fileName, FileMode.Open))
                {
                    var fi = new FileInfo("demo.txt"); //file Title  
                    fileUrl = String.Format("{0}/{1}", formLib.RootFolder.ServerRelativeUrl, fi.Name);
                    Microsoft.SharePoint.Client.File.SaveBinaryDirect(client, fileUrl, fs, true);
                    client.ExecuteQuery();
                }  
                var libFields = formLib.Fields;
                client.Load(libFields);
                client.ExecuteQuery();
                Microsoft.SharePoint.Client.File newFile = client.Web.GetFileByServerRelativeUrl(fileUrl);
                ListItem item = newFile.ListItemAllFields;
                item.Update();
                client.ExecuteQuery();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.ReadKey();
        }
    }

Спасибо,

Sudhakar