2012-03-24 14 views
21

Ho bisogno di caricare un documento in un elenco o una cartella SharePoint utilizzando il modello a lato client da .NET (C#). Qual è il modo migliore per farlo?Carica un documento in un elenco SharePoint dal modello a oggetti lato client

I requisiti sono i seguenti:

  • valori impostati metadati

  • Nessuna limitazione alla dimensione del file

  • deve lavorare con le librerie che superano la Soglia visualizzazione elenco

+0

Chiedono informazioni sul modello JavaScript CLIENT-SIDE o sulla normale modalità client l? –

+0

^Ha dichiarato che sta usando il CSOM .NET (C#). – BrainSlugs83

risposta

19

Per il caricamento del documento su Sharepoin t Document Library utilizzare seguente funzione nel 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(); 

} 
} 

seguito collegamento è utile anche per voi 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

Grazie. Domanda successiva: il primo collegamento spiega come modificare il limite di caricamento, ma è il codice lato server. Sai come scrivere e distribuire il codice lato server come quello? Possiamo scrivere uno script semplice ed eseguirlo sul server? C'è un altro modo per cambiare il limite (lato client forse?)? –

+0

Sfortunatamente, questo codice non consente il caricamento di file da 1,5 MB o più in SharePoint. Per questo è necessario utilizzare il metodo SaveBindaryDirect, REST o FileCreationInformation.ContentStream. –

+0

Ho notato che quando carico un file in questo modo con Versioning attivato, ottengo due versioni separate su ogni aggiornamento: una volta quando si aggiunge un file e un altro quando si chiama ListItemAllFields.Update() – Kristopher

13

Un altro modo è utilizzare il metodo SaveBinaryDirect. Il metodo SaveBinaryDirect utilizza Web Based Distributed Authoring e Versioning (WebDAV) per il caricamento e il download di file. Senza creare il proprio servizio WCF personalizzato, WebDAV è il modo più efficiente per caricare e scaricare file.

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

Il controllo del file aggiornerà il campo Modificato alla data/ora in cui il file è stato archiviato, quindi il tuo esempio non funzionerà completamente come previsto. – Eccentropy

7

Ancora un'altra opzione per il caricamento di un file in un sito di SharePoint (tra cui SharePoint Online) utilizzando 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

Elegante .. grazie! – Colbs

6

ho scoperto che la parte di posta delax che aggiorna nuovi attributi di file/colonne no lavoro, ecco un'altra versione che funziona anche per una libreria infopath personalizzata con campo promosso:

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