Pergunta

Eu decidi usar o SaveBinaryDirect Método para fazer o upload de documentos para o site do sharepoint devido a não ter a solicitação/limitações de tamanho de arquivo que o modelo de objeto cliente tem.

O aplicativo faz as duas coisas, Adiciona uma pasta(usando o modelo de objeto Cliente) e, em seguida, carrega um arquivo selecionado para a pasta que acabou de criar (usando Salvar Binário Directo).

Isso funciona bem na minha instalação aqui.mas no nosso site de clientes, é criada a pasta bem, mas o upload do ficheiro parte retorna "401 não autorizado" de erro.

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

Isso me faz pensar uma de duas coisas

  1. Há uma configuração que precisa ser alterado no ponto de compartilhamento ou de servidor da web no que diz respeito à autorização/autenticação.
  2. O caminho que estou aplicando as credenciais de rede está incorreta.como ele só faz isso para o modelo de objeto cliente, mas não o guardar binário directo.

Estou ciente de que somos capazes de usar o modelo de objeto cliente, e nós pode fazer outro lançamento, se a sua não é uma config/problema de configuração.

Qualquer pessoa com mais experiência com isso tenho algumas idéias sobre o porquê de sua fazendo isso?

Foi útil?

Solução

Se você estiver usando o SharePoint 2013, você não pode usar SaveBinaryDirect, ele não funciona com a autenticação de declarações.A chamada feita por SaveBinaryDirect não inclui a autorização necessária cookies.Detalhes são discutidos nos comentários a este post de blog: Como fazer active a autenticação do Office 365 e do SharePoint Online

Atualização (2 De Julho De 2016):

Tomei outro olhar isso depois de ver o comentário por James Amor.Eu não tenho certeza o que mudou mas o meu teste indica que SaveBinaryDirect está agora a trabalhar com o SharePoint 2013 e o SharePoint Online.

Aqui está o código que usei:

// 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");        

Outras dicas

Tente isso:

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

Eu sou capaz de fazer upload de arquivos de sistema de arquivos para o SharePoint 2010 usando o Modelo de Objeto Cliente.

Se você está recebendo 401 não autorizado, em seguida, certifique-se de que você está fornecendo as credenciais adequadas e corretas relativas URL de destino do SharePoint pasta de biblioteca de documentos.

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

Eu acho que você deve adicionar este:

ctx.RequestTimeout = 3600000;

Eu encontrei o mesmo problema e encontrou uma solução, embora eu não sei se ele é legítimo.

 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

TLDR:você precisa usar o servidor URL relativa, embora o contexto inclui as informações do site.

Eu tive este mesmo problema, e resolvido utilizando o Fiddler.Quando eu usei o Modelo de Objeto cliente, criei o contexto com o caminho de site, i.é."https://server/sites/siteName"e, em seguida,

var docs = web.Lists.GetByTitle(documentLibraryName);
SP.File uploadFile = docs.RootFolder.Files.Add(newFile);
context.Load(uploadFile);
context.ExecuteQuery();

Isto resultou em um POST https://<server>/sites/<siteName>/_vti_bin/client.svc/ProcessQuery o caminho e o nome do arquivo (e o conteúdo) foram incorporados no XML pelo CSOM.

Agora, o SP.File.SaveBinaryDirect assinatura SaveBinaryDirect(ClientContext context, string serverRelativeUrl, Stream stream, bool overwriteIfExists) -- mas o pedido SaveBinaryDirect(context, "/<library>/<folder>/filename", stream, true) falhou com uma mensagem de erro 401.Olhar no Fiddler, e aqui é o pedido feito:

PUT https://<server>/<library>/<filename>

Embora o contexto inclui o site, você tem que dar o todo o caminho a partir da raiz do servidor.A chamada foi bem-sucedida

SaveBinaryDirect(context, "/sites/<sitename>/<library>/<folder>/filename", stream, true)

e que resulta em um posto para o local correto.O parâmetro é chamado serverRelativeUrl depois de tudo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top