Domanda

Ho deciso di utilizzare il metodo salvabinarydirect per caricare documenti sul sito di SharePoint a causa di non avere le limitazioni della dimensione / dimensione del file che il modello del oggetto client ha.

L'applicazione fa due cose, aggiunge una cartella (utilizzando il modello oggetto client) e quindi carichi un file selezionato nella cartella che ha appena creato (utilizzando SAVE BINY Direct).

funziona bene sulla mia configurazione qui. Ma nel nostro sito dei nostri clienti la cartella viene creata, ma la parte di caricamento del file restituisce l'errore "non autorizzato 401".

            SP.ClientContext ctx = new SP.ClientContext(siteurl);
            SP.Web currentWeb = ctx.Web;
            //Pass user details from config (That has owner permissions)
            ctx.Credentials = new NetworkCredential(username, password, domain);   
            //create folder method (checks if the folder exists and creates using Client Object Model)
            CreateFolder(ctx,libraryUrl,folderName)

            //Save Binary Direct Method
            string fileUrl = "/"+ libraryname + "/" + folderName + "/" + fileName;
            using (data)
            {
                //upload by passing the context, file url, file data stream, 
                //set overwrite to true
                SP.File.SaveBinaryDirect(ctx, fileUrl,data, true);
            }
.

Questo mi fa pensare a una delle due cose

    .
  1. Esiste un'impostazione che deve essere modificata nel punto di condivisione o del server Web per quanto riguarda l'autorizzazione / autenticazione.
  2. Il modo in cui sto applicando le credenziali di rete non è corretta. Poiché lo fa solo per il modello dell'oggetto client ma non il salvataggio binario diretto.

    Sono consapevole del fatto che siamo in grado di utilizzare il modello dell'oggetto client e potremmo dover fare un'altra versione se non è un problema di configurazione / configurazione.

    Chiunque abbia più esperienza con questo avere alcune idee sul perché è farlo?

È stato utile?

Soluzione

Se si utilizza SharePoint 2013 non è possibile utilizzare SaveBinaryDirect, non funziona con l'autenticazione delle rivendicazioni.La chiamata effettuata da SaveBinaryDirect non include i cookie di autorizzazione necessari.I dettagli sono discussi nei commenti a questo post del blog: Come eseguire l'autenticazione attiva su Office 365 e SharePoint online

Aggiornamento (2 luglio 2016):

Ho preso un'altra occhiata a questo dopo aver visto il commento di James Love.Non sono sicuro di cosa sia cambiato, ma il mio test indica che SaveBinaryDirect ora lavora con SharePoint 2013 e SharePoint online.

Ecco il codice che ho usato:

// var context = new ClientContext("http://intranet.wingtip.com/sites/demo/");
// context.Credentials = System.Net.CredentialCache.DefaultCredentials;

var context = new ClientContext("https://robwindsor2.sharepoint.com/sites/demo/");
context.Credentials = new SharePointOnlineCredentials(loginName, securePassword);

var web = context.Web;
var lib = web.Lists.GetByTitle("Documents");

context.Load(lib);
context.Load(lib.RootFolder);
context.ExecuteQuery();

var fileName = "Test.docx";
var filePath = @"C:\Users\robwindsor\Desktop\" + fileName;
using (var fs = new FileStream(filePath, FileMode.Open))
{
    Microsoft.SharePoint.Client.File.SaveBinaryDirect(context, lib.RootFolder.ServerRelativeUrl + "/" + fileName, fs, true);
}

var query = new CamlQuery();
query.ViewXml = "<View></View>";
var files = lib.GetItems(query);

context.Load(files, c => c.Include(f => f.File));
context.ExecuteQuery();

foreach(ListItem item in files)
{
    Console.WriteLine(item.File.Name);
}

Console.WriteLine("Done");        
.

Altri suggerimenti

Prova questo:

FileCreationInformation fci = new FileCreationInformation();

fci.Content = newFile.Bytes;

fci.Url = sourceFile.Url;

fci.Overwrite = true;

Microsoft.SharePoint.Client.File replacedFile = list.RootFolder.Files.Add(fci);

context.Load(replacedFile);

context.ExecuteQuery();
.

Sono in grado di caricare il file dal file system a SharePoint 2010 utilizzando il modello dell'oggetto client.

Se si sta ricevendo non autorizzati 401, assicurati di fornire le credenziali giuste e il corretto URL relativo della cartella Biblioteca Documenti di SharePoint di destinazione.

ClientContext ctx = new ClientContext(Siteurl);
ctx.Credentials = new System.Net.NetworkCredential("username", "password", "domain");
var sourceFilePath = @"C:\test\test.xlsx";
var targetUrl = "/Shared%20Documents";
var targetFileUrl = String.Format("{0}/{1}", targetUrl, Path.GetFileName(sourceFilePath));
var fs = new FileStream(sourceFilePath, FileMode.Open);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(ctx, targetFileUrl, fs, true);
var uploadedFile = ctx.Web.GetFileByServerRelativeUrl(targetFileUrl);
var listItem = uploadedFile.ListItemAllFields;
listItem.Update();
ctx.ExecuteQuery();
.

Penso che devi aggiungere questo:

ctx.RequestTimeout = 3600000;
.

Ho incontrato lo stesso problema e ho trovato una soluzione alternativa anche se non so se è legittimo.

 System.Net.WebClient webClient = new System.Net.WebClient();

 System.Uri uri = new Uri(url); //Create a uri object with the file name but without extension

 webClient.Credentials = new NetworkCredential(username,password,domain);        //Network credentials to connect with the sharepoint server

 webClient.UploadFile(uri, "PUT", pFilePath);     //Upload File will push the file to the server
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top