2012-03-24 9 views
21

Potrzebuję przesłać dokument do listy lub folderu programu SharePoint przy użyciu modelu obiektu po stronie klienta z .NET (C#). Jaki jest najlepszy sposób na zrobienie tego?Prześlij dokument do listy programu SharePoint z obiektu po stronie klienta Model

Wymagania są następujące:

  • zestaw metadanych wartości

  • bez ograniczenia rozmiaru pliku

  • musi współpracować z bibliotekami, które przekraczają widoku listy Próg

+0

proszą o modelu po stronie klienta JavaScript lub normalnym trybie klienta l? –

+0

^Stwierdził, że używa CSOM .NET (C#). – BrainSlugs83

Odpowiedz

19

Przesyłanie dokumentów do Sharepoin t Biblioteka dokumentów wykorzystać następującą funkcję w Client Object Model:

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(); 

} 
} 

poniższy link jest również pomocne dla Ciebie 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

+0

Dzięki. Pytanie uzupełniające: pierwszy link wyjaśnia, jak zmienić limit przesyłania, ale jest to kod po stronie serwera. Czy wiesz, jak napisać i wdrożyć taki kod po stronie serwera? Czy możemy napisać prosty skrypt i uruchomić go na serwerze? Czy jest jakiś inny sposób na zmianę limitu (może po stronie klienta?)? –

+0

Niestety ten kod nie zezwala na przesyłanie plików o wielkości co najmniej 1,5 MB do programu SharePoint. W tym celu należy użyć metody SaveBindaryDirect, REST lub FileCreationInformation.ContentStream. –

+0

Zauważyłem, że gdy przesyłam plik w ten sposób z włączoną wersją, otrzymuję dwie oddzielne wersje każdej aktualizacji: raz podczas dodawania pliku i innego podczas wywoływania ListItemAllFields.Update() – Kristopher

13

Innym sposobem jest używać metody SaveBinaryDirect. Metoda SaveBinaryDirect korzysta z opartego na sieci Web rozproszonego tworzenia i wersjonowania (WebDAV) do przesyłania i pobierania plików. Bez budowania własnej niestandardowej usługi WCF, WebDAV to najbardziej wydajny sposób przesyłania i pobierania plików.

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); 
+1

Sprawdzanie w pliku spowoduje aktualizację zmodyfikowanego pola do daty/czasu, w którym plik został sprawdzony, więc twój przykład nie będzie działał całkowicie zgodnie z oczekiwaniami. – Eccentropy

7

Jeszcze inną opcją przesyłania plików do witryny programu SharePoint (w tym SharePoint Online) używając File.SaveBinaryDirect Method:

/// <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); 
     } 
    } 
+1

Eleganckie .. dzięki! – Colbs

6

okazało się, że część delax stanowisku, że aktualizuje nowy plik atrybuty/kolumn nie będzie praca, tu jest inna wersja, że ​​nawet wroks dla biblioteki niestandardowej InfoPath z promowanej polu:

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; 
    }