Passaggio all'ora legale 31 marzo 2019 02:0003:00 sposta avanti l'orologio di 1 ora (si dorme 1 ora in meno)
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.
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):
//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);
    }
  }
}