Fórum UPLOAD #8385
06/08/2009
0
Necessito fazer um UPLOAD de um determinado diretório da máquina CLIENTE, para um determinado diretório
da máquina SERVIDOR.
Sei utilizar o FileUpload, inclusive fiz o programa para enviar individualmente.
Entretanto como é uma quantidade muito grande de arquivos (XML), não tem como o cliente enviar individualmente. protected void Button1_Click(object sender, EventArgs e)
{
string[] files;
files = Directory.GetFiles("C:\\Arquivos XML");
destino = "C:\\Temp\Arquivos XML"
foreach (string file in files)
{
// Desejo aqui fazer o upload de cada arquivo para o destino no Servidor
}
} Grato Sidney
Sidney Mendonça/
Curtir tópico
+ 0Posts
08/08/2009
Luiz Maia
Gostei + 0
08/08/2009
Luiz Maia
Gostei + 0
08/08/2009
Sidney Mendonça/
Eu usei o componente FileUpload da ToolBox. Entretanto ele exige que o arquivo seja selecionado
manualmente, pois a propriedade FileName do mesmo é read only.
2) Que comando usar para fazer o Upload?
Eu tentei usar o mesmo componente FileUpload1.SaveAs(Destino+NomeArquivo). Ele funciona normalmente se cada arquivo
for selecionado individualmente pelo usuário. Entretanto como disse acima não consegui mudar a propriedade
FileName. 3) Quanto a abrir o diretório e pegar cada arquivo eu não tenho dificuldade.
Obrigado por me atender.
[]s
Sidney
Gostei + 0
09/08/2009
Luiz Maia
Abra o VS2005 e com ele crie um novo projeto do tipo Web. Elimine ou altere nome do arquivo Default.aspx, deixando como upload.aspx. Também adicione um novo diretório com o nome de upload no Projeto e seu Soluction Explorer deve estar como a imagem que segue, figura 1.0.
Figura 1.0 – Soluction Explorer
Adicione os seguintes controles na página upload.aspx.
1 Controle FileUpload
ID = fupArquivo
1 Controle ListBox
ID = lstArquivos
3 Controles Button
Button1
ID = btnAdicionar
Text = Adicionar
Button2
ID = btnUpload
Text = Upload
Button3
ID = btnDeletar
Text = Deletar
1 Label
ID = lblMensagem
Text = “”
Organize os controles como você preferir, eu os organizei como segue na figura 1.1
Figura 1.1 – Organização dos controles na página
Vamos agora ao código. De um duplo clique sobre o botão Adicionar e insira o seguinte código:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
public partial class upload : System.Web.UI.Page
{
//Criamos uma variável do tipo ArrayList. Perceba que ela é “Estática”
static public ArrayList arrArquivos = new ArrayList();
protected void Page_Load(object sender, EventArgs e)
{
//Page_Load Event.
}
protected void btnAdicionar_Click(object sender, EventArgs e)
{
//Vamos verificar se não existe arquivo selecionado no controle FileUpload.
if(!fupArquivo.HasFile)
{
ClientScriptManager cs = Page.ClientScript;
cs.RegisterClientScriptBlock(this.GetType(),"Erro","alert(Selecione um arquivo para carregar!)",true);
return;
}
//Verificamos o tamanho do arquivo em bytes. Nesse caso faço Upload de até 11MB
if(fupArquivo.PostedFile.ContentLength > 11000000)
{
ClientScriptManager cs = Page.ClientScript;
cs.RegisterClientScriptBlock(this.GetType(), "Erro", "alert(O tamanho do arquivo é maior que o tamanho permitido!)", true);
return;
}
else
{
//Adicionamos o arquivo ao arrayList, em seguida ao ListBox.
arrArquivos.Add(fupArquivo);
lstArquivos.Items.Add(fupArquivo.PostedFile.FileName);
}
}
}
Perceba que o código está comentado onde acredito realmente ter necessidade, portanto dispensa maiores comentários.
Vamos adiante com o nosso exemplo. Vamos agora codificar o botão “Deletar”.
Novamente, em modo design, efetue um duplo clique no botão Deletar e insira o seguinte código.
protected void btnDeletar_Click(object sender, EventArgs e)
{
if(lstArquivos.SelectedIndex > -1) //Se for selecionado algum item da lista
{
arrArquivos.Remove(lstArquivos.SelectedValue); //Remove o item do ArrayList
lstArquivos.Items.Remove(lstArquivos.SelectedValue); // Remove tbm do ListBox
}
else
{
ClientScriptManager cs = Page.ClientScript;
cs.RegisterClientScriptBlock(this.GetType(),"Selecionar","alert(Selecione um arquivo na lista!)",true);
return;
}
}
O botão Deletar como podemos perceber através do código, vai nos permitir eliminar arquivos da lista de Uploads. Este botão remove o item do ListBox e obrigatóriamente também deve remover do ArrayList para evitar exceptions.
Agora vamos codificar o botão “Upload” da mesma forma que codificamos os controles antecedentes. Efetue um duplo clique sobre o botão Upload e insira o código.
protected void btnUpload_Click(object sender, EventArgs e)
{
//Pegamos o caminho do diretório onde vamos salvar os Uploads
String caminho = Server.MapPath("upload\");
foreach(FileUpload iFile in arrArquivos) //Para cada Arquivo iFile em arrArquivos
{
//Salvo o arquivo no diretório base, nesse caso "caminho".
iFile.PostedFile.SaveAs(caminho + Path.GetFileName(iFile.PostedFile.FileName));
lblMensagem.Text = "Upload de: " + lstArquivos.Items.Count.ToString() + " arquivo (s) Realizado com sucesso!";
}
lstArquivos.Items.Clear(); //Limpamos o ListBox
arrArquivos.Clear(); //Limpamos o ArrayList
}
Para finalizarmos, se faz necessário uma pequena configuração no arquivo web.config já que neste exemplo estou criando um Upload de até 11MB. Abra o arquivo web.config e dentro de <system.web> temos que configurar nossa aplicação de modo que ela nos permita adicionar arquivos com até 11MB. Isso se faz através do elemento httpRunTime. Veja como ficou o meu arquivo web.config.
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<compilation debug="true"/>
<authentication mode="Windows"/>
<httpRuntime
executionTimeout="90"
maxRequestLength="11000"
/>
</system.web>
</configuration>
executionTimeout="90"
Especifica o número máximo de segundos em que é permitido a execução de um pedido [request], após este tempo o request é finalizado automaticamente
maxRequestLength="11000"
Determina o tamanho máximo do arquivo de Upload, definido em KB. O padrão é de 4096
Feito este ajuste no web.config pode rodar sua aplicação e adicione e exclua arquivos na lista e finalmente efetue o Upload dos arquivos. Se você seguiu corretamente os passos indicados neste artigo sua aplicação deve funcionar perfeitamente.
Após o Upload dos arquivos, no Server Explorer do VS2005, clique em Refresh para atualizar o a árvore de projeto e você verá os arquivos listados no diretório upload. Figura 1.2.
Figura 1.2 - Refresh no Soluction Explorer
Gostei + 0
10/08/2009
Luiz Maia
Gostei + 0
12/08/2009
Sidney Mendonça/
Gostei + 0
12/08/2009
Sidney Mendonça/
Gostei + 0
12/08/2009
Sidney Mendonça/
É quase aquilo que preciso, exceto ter que selecionar arquivo por arquivo, e adicionar.
Pois na minha necessidade, eu tenho diversos arquivos gerados diariamente no cliente, que devem ser eviados para o servidor.
Se eu deixar o usuário selecionar um a um, ele pode esquecer de algum. Ficaria excelente para mim o seguinte: AcrescentAR no exemplo enviado um botão CARREGAR, que adiciona no LISTBOX "lstArquivos" todos os
arquivos do diretório que desejo enviar (ao inves de selecionar um a um). Até Tentei fazer: Populei o LISTBOX "lstArquivos", porem deu erro mais tarde ao clicar no botão UPLOAD, porque os
tipos são diferentes usei string e no btnUpload é usado o FileUpload. protected void btnCarregar_Click(object sender, EventArgs e)
{
string[] files;
files = Directory.GetFiles("C:\\Arquivos XML");
foreach (string file in files)
{
//Adicionamos o arquivo ao arrayList, em seguida ao ListBox.
arrArquivos.Add(file);
lstArquivos.Items.Add(file);
}
} protected void btnUpload_Click(object sender, EventArgs e)
{
//Pegamos o caminho do diretório onde vamos salvar os Uploads
String caminho = Server.MapPath(@"Upload\Upload");
foreach(FileUpload iFile in arrArquivos) //Para cada Arquivo iFile em arrArquivos
{
//Salvo o arquivo no diretório base, nesse caso "caminho".
iFile.PostedFile.SaveAs(caminho + Path.GetFileName(iFile.PostedFile.FileName));
lblMensagem.Text = "Upload de: " + lstArquivos.Items.Count.ToString() + " arquivo (s) Realizado com sucesso!";
}
lstArquivos.Items.Clear(); //Limpamos o ListBox
arrArquivos.Clear(); //Limpamos o ArrayList
} Grato Sidney
Gostei + 0
13/08/2009
Luiz Maia
Gostei + 0
13/08/2009
Sidney Mendonça/
Gostei + 0
13/08/2009
Sidney Mendonça/
Gostei + 0
14/08/2009
Luiz Maia
Gostei + 0
17/08/2009
Luiz Maia
Gostei + 0
19/08/2009
Sidney Mendonça/
Até me animei quando vi o seu exemplo de multiplos uploads.
Entretanto é um multiplo upload que tem que ser selecionado um a um. Imagine 300 / 400 arquivo que é o meu caso!!!
PERGUNTO:Não existe uma maneira de converter 'System.String' to type 'System.Web.UI.WebControls.FileUpload'?
Se tiver da para fazer, usando o mesmo exemplo que você me enviou, colocando um botão carregar como a seguir: protected void btnCarregar_Click(object sender, EventArgs e)
{
string[] files;
files = Directory.GetFiles("C:\\Arquivos XML");
foreach (string file in files)
{
//Adicionamos o arquivo ao arrayList, em seguida ao ListBox.
arrArquivos.Add(CONVERTER_PARA_FILEUPLOAD(file));
lstArquivos.Items.Add(file);
}
} Grato
Sidney
Gostei + 0
20/08/2009
Luiz Maia
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)