Upload file con il Client Object Model di SharePoint
Con il Client Object Model di SharePoint è possibile fare l'upload di un file tramite l'oggetto FileCreationInformation.
Con questo metodo è possibile impostare anche i meta dati.
L'unico problema è che ha un limite di upload di 2MB.
Per superare il limite di upload bisogna utilizzare Microsoft.SharePoint.Client.File.SaveBinaryDirect che non ha limiti ma non permette di impostare i metadati.
Quello che segue è un esempio di upload che usa il primo metodo (FileCreationInformation) per i file inferiori a 1MB e per impostare eventuali metadati. Per i file più grandi chiama, successivamente, il secondo metodo (SaveBinaryDirect):
Con questo metodo è possibile impostare anche i meta dati.
L'unico problema è che ha un limite di upload di 2MB.
Attenzione 2MB comprensivi di tutto il pacchetto dati, quindi non solo il file.
Per essere sicuri che funzioni sempre conviene non superare il limite di 1MB.Per superare il limite di upload bisogna utilizzare Microsoft.SharePoint.Client.File.SaveBinaryDirect che non ha limiti ma non permette di impostare i metadati.
Quello che segue è un esempio di upload che usa il primo metodo (FileCreationInformation) per i file inferiori a 1MB e per impostare eventuali metadati. Per i file più grandi chiama, successivamente, il secondo metodo (SaveBinaryDirect):
C#
//file origine
string filePath = "File1.txt";
byte[] content = System.IO.File.ReadAllBytes(filePath);
//destinazione
string webUrl = "https://sharepoint.sgart.local/sites/alberto";
Uri u = new Uri(webUrl);
string destinationPath = u.AbsolutePath.TrimEnd('/') + "/Shared Documents/F1";
string fileName = System.IO.Path.GetFileName(filePath); // nome del file salvato su SharePoint
// credenziali di accesso
string user = @"dominio\utente";
string pwd = "password";
const int UPLOAD_SIZE_LIMIT = 1048576; //2 MB dimensione massima del messaggio di upload, considerando dati nome file ecc, mi tengo un margine di sicurezza e lo abbasso a 1MB ... gia con 1,5MB dava errore di messaggio troppo lungo
// creo il contesto client sharepoint
using (ClientContext ctx = new ClientContext(webUrl))
{
//autenticazione
ctx.AuthenticationMode = ClientAuthenticationMode.Default;
ctx.Credentials = new System.Net.NetworkCredential(user, pwd);
// ricavo la folder dove va caricato il file (la folder deve esistere)
Folder folder = ctx.Web.GetFolderByServerRelativeUrl(destinationPath);
// creo l'oggetto per l'upload del file
FileCreationInformation fi = new FileCreationInformation();
//fi.Url = destinationPath + "/" + filePath;
fi.Url = fileName;
fi.Overwrite = true;
// file da uploadare
if (content.LongLength > UPLOAD_SIZE_LIMIT)
fi.Content = new byte[1]; // se il file è troppo grande salvo uno file fittizio, quello reale verrà caricato dopo
else
fi.Content = content; // altrimenti salvo il file <= 1MB
//aggiungo il file alla folder (messaggio totale max 2MB)
Microsoft.SharePoint.Client.File fileNew = folder.Files.Add(fi);
//leggo il server relative path del nuovo file
ctx.Load(fileNew, x => x.ServerRelativeUrl);
//aggiorno le proprietà
ListItem item = fileNew.ListItemAllFields;
item["Title"] = fileName;
item.Update();
ctx.Load(item);
// esegui i comandi caricati nel contesto -> salvo il file
ctx.ExecuteQuery();
if (content.LongLength > UPLOAD_SIZE_LIMIT)
{
//per superare i problemi di upload con grossi file uso SaveBinaryDirect https://msdn.microsoft.com/en-us/pnp_articles/upload-large-files-sample-app-for-sharepoint
using (System.IO.MemoryStream fs = new System.IO.MemoryStream(content))
{
Microsoft.SharePoint.Client.File.SaveBinaryDirect(ctx, fileNew.ServerRelativeUrl, fs, true);
}
}
}