none
Upload documentos WebPart RRS feed

  • Pergunta

  • Olá,

    Sou novo com Sharepoint, e estou criando uma WebPart para fins de estudo. Essa WP vai fazer um upload em uma biblioteca de documentos. Pesquisando eu encontrei o seguinte código.

                using (SPSite sites = new SPSite(SPContext.Current.Site.Url))
                {
                    using (SPWeb web = sites.OpenWeb())
                    {
                        SPWebCollection subsites = web.GetSubwebsForCurrentUser(); //get subsites
                        for (int i = 0; i < subsites.Count; i++)
                        {
                            SPWeb subSiteWeb = subsites[i];
    
                            SPList CurrentList = subSiteWeb.Lists["Documentos"];
                            if (CurrentList != null)
                            {
                                byte[] doc = System.IO.File.ReadAllBytes(@"C:\meuarquivo.docx");
    
                                CurrentList.RootFolder.Files.Add("meuarquivo.docx", doc);
                                break;
                            }
                                
                        }
                    }
                }
    

    Onde, no SPWebCollection eu pego os subsites e faço o upload do documento. Nesse exemplo eu percorro todos os subsites a procura da lista chamada "Documentos", no meu caso eu tenho dois subsites com essa biblioteca, ou seja, ele está inserindo o item nessas duas listas.

    Alguém poderia me dar uma força com isso?

    quinta-feira, 19 de julho de 2012 15:07

Respostas

  • Diogo, algo +ou- assim

    SPSite site = SPContext.Current.Site // Site Corrente
    SPWeb web = site.OpenWeb();

    SPList CurrentList = web.Lists["Documentos"];

    if (CurrentList != null)
    {
       byte[] doc = System.IO.File.ReadAllBytes(@"C:\meuarquivo.docx");
       CurrentList.RootFolder.Files.Add("meuarquivo.docx", doc);
     }

    Sugiro que utilize o Controle FileUpload ao inves de
    byte[] doc = System.IO.File.ReadAllBytes(@"C:\meuarquivo.docx");

    Qualquer dúvida é só perguntar.


    Atenciosamente, Rafael Fausto

    • Marcado como Resposta Diogo_Costa sexta-feira, 20 de julho de 2012 00:58
    quinta-feira, 19 de julho de 2012 17:53
  • Oi,

    você não precisa navegar em todos os sub-sites. SPContext utiliza o contexto atual.

    string arquivo = "meuarquivo.docx";
    
    using(SPWeb web = SPContext.Current.Web)
    {
    
    SPDocumentLibrary doc = web.List["Documentos"] as SPDocumentLibrary;
    
    bytes[] mBytes = ...
    
    SPFile spFile = doc.RootFolder.Files.Add(arquivo, mBytes, true);
    
    spFile.Update();
    
    }



    ROBERTOSLJUNIOR

    • Marcado como Resposta Diogo_Costa sexta-feira, 20 de julho de 2012 00:54
    quinta-feira, 19 de julho de 2012 18:00
  • Mas essa web part não ficaria no http://diogo:porta/meuSite ?

    Desse jeito, a web part vai pegar o site atual. :)


    Atenciosamente, Rafael Fausto

    Diogo, altere o código do Rafael para o seguinte:

    SPSite site = SPContext.Current.Web.Url // SPWeb Corrente
    SPWeb web = site.OpenWeb();
    
    SPList CurrentList = web.Lists.TryGetList("Documentos");
     //mudei, da forma que estava se a lista não existir, vai lançar exceção. 
    if (CurrentList != null)
    {
       byte[] doc = System.IO.File.ReadAllBytes(@"C:\meuarquivo.docx");
       CurrentList.RootFolder.Files.Add("meuarquivo.docx", doc);
     }
    
    web.Dispose();
    site.Dispode();

    Lembrando que existem diversas outras maneiras de fazer o que você quer. E como o Rafael mencionou, usar "byte[] doc = System.IO.File.ReadAllBytes(@"C:\meuarquivo.docx");" não é aconselhável. Lembre-se que o contexto C: será o do servidor, e não o da maquina do usuario.

    Abraço!


    Se esta resposta foi útil para você, por favor, marque como Resposta! Muito Obrigado! :) Thiago Silva Especialista SharePoint http://thiagottss.com.br


    quinta-feira, 19 de julho de 2012 18:49

Todas as Respostas

  • Diogo,

    O que você precisa?


    Atenciosamente, Rafael Fausto

    quinta-feira, 19 de julho de 2012 17:08
  • Olá Diogo,

    Isso.. Pego código, vc percorre todos os subsites e inseri o arquivo nas listas que tem o nome de "Documentos".

    Você precisa inserir em um subsite especifico?

    Abraço..

    quinta-feira, 19 de julho de 2012 17:10
  • E ae Rafael e Elton,

    Então, eu queria inserir na biblioteca de "Documentos" do site onde consta o meu webpart, pois se eu tiver dois subsites com a biblioteca "Documentos" ele vai inserir meu arquivo nos dois. =/

    Seria em um específico, mas que fosse identificado pelo código. Seria o subsite de onde eu disparei o webpart... algo assim.

    Será que tem alguma forma de fazer isso?
    • Editado Diogo_Costa quinta-feira, 19 de julho de 2012 17:34
    quinta-feira, 19 de julho de 2012 17:32
  • Diogo, algo +ou- assim

    SPSite site = SPContext.Current.Site // Site Corrente
    SPWeb web = site.OpenWeb();

    SPList CurrentList = web.Lists["Documentos"];

    if (CurrentList != null)
    {
       byte[] doc = System.IO.File.ReadAllBytes(@"C:\meuarquivo.docx");
       CurrentList.RootFolder.Files.Add("meuarquivo.docx", doc);
     }

    Sugiro que utilize o Controle FileUpload ao inves de
    byte[] doc = System.IO.File.ReadAllBytes(@"C:\meuarquivo.docx");

    Qualquer dúvida é só perguntar.


    Atenciosamente, Rafael Fausto

    • Marcado como Resposta Diogo_Costa sexta-feira, 20 de julho de 2012 00:58
    quinta-feira, 19 de julho de 2012 17:53
  • Oi,

    você não precisa navegar em todos os sub-sites. SPContext utiliza o contexto atual.

    string arquivo = "meuarquivo.docx";
    
    using(SPWeb web = SPContext.Current.Web)
    {
    
    SPDocumentLibrary doc = web.List["Documentos"] as SPDocumentLibrary;
    
    bytes[] mBytes = ...
    
    SPFile spFile = doc.RootFolder.Files.Add(arquivo, mBytes, true);
    
    spFile.Update();
    
    }



    ROBERTOSLJUNIOR

    • Marcado como Resposta Diogo_Costa sexta-feira, 20 de julho de 2012 00:54
    quinta-feira, 19 de julho de 2012 18:00
  • Rafael,

    Só com o "SPSite site = SPContext.Current.Site" eu não acesso o subsite. Ele fica por exemplo: http://diogo:porta/. Eu precisava de http://diogo:porta/meuSite.

    quinta-feira, 19 de julho de 2012 18:04
  • Diogo,

    Uma sugestão seria vc preencher um controlador DropDownList com o nome dos seus subsites.
    Ao carregar o arquivo ele verifica qual o subsite no controlador e pesquisa o endereço do seu subsite e adiciona o arquivo na lista.

    Tem muitas formas de pesquisa do subsite.
    Pode ser usando "if" dentro do seu for pegando o nome e comparando com o controlador e etc.. 

    Agora a regra definida é essa? se existir a webpart naquele subsite ele inseri o arquivo?

    quinta-feira, 19 de julho de 2012 18:19
  • Mas essa web part não ficaria no http://diogo:porta/meuSite ?

    Desse jeito, a web part vai pegar o site atual. :)


    Atenciosamente, Rafael Fausto

    quinta-feira, 19 de julho de 2012 18:19
  • Mas essa web part não ficaria no http://diogo:porta/meuSite ?

    Desse jeito, a web part vai pegar o site atual. :)


    Atenciosamente, Rafael Fausto

    Diogo, altere o código do Rafael para o seguinte:

    SPSite site = SPContext.Current.Web.Url // SPWeb Corrente
    SPWeb web = site.OpenWeb();
    
    SPList CurrentList = web.Lists.TryGetList("Documentos");
     //mudei, da forma que estava se a lista não existir, vai lançar exceção. 
    if (CurrentList != null)
    {
       byte[] doc = System.IO.File.ReadAllBytes(@"C:\meuarquivo.docx");
       CurrentList.RootFolder.Files.Add("meuarquivo.docx", doc);
     }
    
    web.Dispose();
    site.Dispode();

    Lembrando que existem diversas outras maneiras de fazer o que você quer. E como o Rafael mencionou, usar "byte[] doc = System.IO.File.ReadAllBytes(@"C:\meuarquivo.docx");" não é aconselhável. Lembre-se que o contexto C: será o do servidor, e não o da maquina do usuario.

    Abraço!


    Se esta resposta foi útil para você, por favor, marque como Resposta! Muito Obrigado! :) Thiago Silva Especialista SharePoint http://thiagottss.com.br


    quinta-feira, 19 de julho de 2012 18:49
  • Pois é Rafael, refiz os testes aqui e ele só trás http://diogo:porta/ mesmo. A não ser que eu esteja fazendo alguma coisa errada.

    Eu criei uma web part aqui de teste e coloquei um botao e no evento coloquei o SPSite site = SPContext.Current.Site; e mandei imprimir em um label. label.text = site.ToString(); e ele retorna http://diogo:porta/ mesmo. =/

    Mais alguma sugestão?
    • Editado Diogo_Costa quinta-feira, 19 de julho de 2012 18:50
    quinta-feira, 19 de julho de 2012 18:50
  • mande imprimir o SPContext.Current.Web e não do SPContext.Current.Site.

    Atenciosamente, Rafael Fausto

    quinta-feira, 19 de julho de 2012 18:55
  • Thiago,

    Aqui utilizando .Url, ele exige que a minha variável seja do tipo string e que ocorra uma conversão.

    SPSite site = SPContext.Current.Web.Url 

    Rafael,

    Ao retornar o SPContext.Current.Web ele tras o nome do meu subsite. 

    Eu estou usando o

     byte[] doc = System.IO.File.ReadAllBytes(@"C:\meuarquivo.docx");
       CurrentList.RootFolder.Files.Add("meuarquivo.docx", doc);

    Apenas para teste.

    • Editado Diogo_Costa quinta-feira, 19 de julho de 2012 19:57
    quinta-feira, 19 de julho de 2012 19:55
  • Eu só disse para você utilizar o SPContext.Current.Web.Url para você verificar que está utilizando o site correto.

    O correto é como disse no post anterior.

    SPSite site = SPContext.Current.Site
    SPWeb web = site.OpenWeb();


    Atenciosamente, Rafael Fausto


    • Editado Rafael Fausto quinta-feira, 19 de julho de 2012 20:01 erro de sintaxe
    quinta-feira, 19 de julho de 2012 20:00
  • Mude para:

    SPSite site = new SPSite("SPContext.Current.Web.Url");


    Se esta resposta foi útil para você, por favor, marque como Resposta! Muito Obrigado! :) Thiago Silva Especialista SharePoint http://thiagottss.com.br

    quinta-feira, 19 de julho de 2012 20:01
  • Thiago,

    Estou recebendo null na seguinte linha:

    SPList CurrentList = web.Lists.TryGetList("Documentos");

    Rafael,

    Blz. ;)

    quinta-feira, 19 de julho de 2012 20:14
  • Diogo,

    Uma sugestão seria vc preencher um controlador DropDownList com o nome dos seus subsites.
    Ao carregar o arquivo ele verifica qual o subsite no controlador e pesquisa o endereço do seu subsite e adiciona o arquivo na lista.

    Tem muitas formas de pesquisa do subsite.
    Pode ser usando "if" dentro do seu for pegando o nome e comparando com o controlador e etc.. 

    Agora a regra definida é essa? se existir a webpart naquele subsite ele inseri o arquivo?

    Pois é Elton, acho que o DropDownList não vai me atender.

    Imaginei que com esse código que eu postei, ele iria pegar o site corrente. =/


    quinta-feira, 19 de julho de 2012 20:25
  • Diogo,

    Tem certeza que o título da Biblioteca é Documentos?


    Atenciosamente, Rafael Fausto

    quinta-feira, 19 de julho de 2012 20:27
  • Thiago,

    Estou recebendo null na seguinte linha:

    SPList CurrentList = web.Lists.TryGetList("Documentos");

    Rafael,

    Blz. ;)


    Então a sua biblioteca não existe nesse Site onde a WebPart está. O Nome está correto? Seu SharePoint é o 2010, certo?

    Se esta resposta foi útil para você, por favor, marque como Resposta! Muito Obrigado! :) Thiago Silva Especialista SharePoint http://thiagottss.com.br

    quinta-feira, 19 de julho de 2012 20:29
  • Thiago,

    Consegui, mudei o 

    SPWeb web = site.OpenWeb();

    para 

    SPWeb web = SPContext.Current.Web;

    ficou assim:

                using (SPSite site = new SPSite(SPContext.Current.Site.Url))
                {
                    SPWeb web = SPContext.Current.Web;
                        
                    SPList CurrentList = web.Lists.TryGetList("Documentos");
                    
                    if (CurrentList != null)
                    {
                        byte[] doc = System.IO.File.ReadAllBytes(@"C:\seuarquivo.docx");
                        CurrentList.RootFolder.Files.Add("seuarquivo.docx", doc);
                    }
                    
                }

    Super bobo. =/

    Agora vou prosseguir com a criação do web part.

    Muito obrigado a todos. Abraço.


    • Editado Diogo_Costa quinta-feira, 19 de julho de 2012 21:02
    quinta-feira, 19 de julho de 2012 21:01
  • Thiago,

    Consegui, mudei o 

    SPWeb web = site.OpenWeb();

    para 

    SPWeb web = SPContext.Current.Web;

    ficou assim:

                using (SPSite site = new SPSite(SPContext.Current.Site.Url))
                {
                    SPWeb web = SPContext.Current.Web;
                        
                    SPList CurrentList = web.Lists.TryGetList("Documentos");
                    
                    if (CurrentList != null)
                    {
                        byte[] doc = System.IO.File.ReadAllBytes(@"C:\seuarquivo.docx");
                        CurrentList.RootFolder.Files.Add("seuarquivo.docx", doc);
                    }
                    
                }

    Super bobo. =/

    Agora vou prosseguir com a criação do web part.

    Muito obrigado a todos. Abraço.


    Oi Diogo,

    você chegou a ver o exemplo de código que eu postei?

    SPContext retorna o contexto atual.

    using(SPWeb web = SPContext.Current.Web)
    {
    try
    {
       SPDocumentLibrary lista = web.Lists["Documentos"] as SPDocumentLibrary;
    ....
       //RESTO DO CODIGO
    }
    catch{}
    }


    ROBERTOSLJUNIOR

    quinta-feira, 19 de julho de 2012 21:53
  • Vi sim, eu que dei mole. Você tinha passado a dica correta e eu continuei perturbando o pessoal... rsrsrs... Mas valeu pela paciência!

    Abraços.

    sexta-feira, 20 de julho de 2012 00:54