Usuário com melhor resposta
Upload documentos WebPart

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?
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
-
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
-
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
- Editado Thiago Silva - SharePoint quinta-feira, 19 de julho de 2012 18:51 atualizei o código
- Marcado como Resposta Diogo_Costa sexta-feira, 20 de julho de 2012 00:58
Todas as Respostas
-
-
-
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
-
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
-
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
-
-
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?
-
-
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
- Editado Thiago Silva - SharePoint quinta-feira, 19 de julho de 2012 18:51 atualizei o código
- Marcado como Resposta Diogo_Costa sexta-feira, 20 de julho de 2012 00:58
-
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
-
-
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
-
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
-
-
-
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. =/
-
-
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
-
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
-
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
-