Fórum UPLOAD #8385

06/08/2009

0

Olá Pessoal.
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/

Sidney Mendonça/

Responder

Posts

08/08/2009

Luiz Maia

Ola Sydnei,
Responder

Gostei + 0

08/08/2009

Luiz Maia

Ola Sydnei,   Para fazer o que necessita vc deve fazer o seguinte:   Pedir ao usuario que escolha o diretorio a ser "varrido". Sete no web.config um caminho para os uploads serem salvos. De permissáo de escrita nesta pasta de uploads. Usando o Directory.getFiles, faça um foreach e chame um metodo de upload, passando o caminho de cada arquivo listado no foreach. O seu metodo pode receber um File mesmo.   Caso não consiga fazer, me avise que monto um exemplo para vc, ok?   Abraços e aguardo um retorno seu.   Att Luiz Maia      
Responder

Gostei + 0

08/08/2009

Sidney Mendonça/

Olá Luiz. Se você puder me enviar um exemplo eu ficarei muito grato. Pois eu tenho as seguintes dificuldades: 1)Qual o componente usar para pedir para o ususário selecionar um diretório?
  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
Responder

Gostei + 0

09/08/2009

Luiz Maia

Ola Sydnei,   Como vc esta usando fielupload, aplicacao web, nao tem um recurso para selecionar diretorios. Apenas aplicacao windows possui este recurso.   Outra coisa, vc nao consegue alterar a propriedade FileName, para gerar novos arquivos, vc deve copia-los primeiramente e depois alterar o nome do arquivo. Ao alterar o nome, automaticamente ele muda o FileName.   Ainda nao entendi o que realmente quer fazer. Vc quer que o usuario selecione um diretorio e todos os arquivos dentro dele sejam feitos o update para o servidor?   De tb uma olhada noartigo abaixo, pode elucidar algo.   Aguardo um retorno seu,ok?           =====================================================       Realizar 1 upload de arquivo com ASP.NET é tarefa muito simples. Classes e controles existentes no .NET Framework facilitam em muito nosso trabalho, e como não poderia ser diferente, venho neste arquivo demonstrar como realizar Upload de múltiplos arquivos usando um ArrayList(). Então, mãos à obra.

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
Responder

Gostei + 0

10/08/2009

Luiz Maia

Ola Sydnei, como esta indo? Aguardo retorno   Att Luiz Maia
Responder

Gostei + 0

12/08/2009

Sidney Mendonça/

Olá Luiz. Como eu falei no início e sei fazer o upload utilizando os recursos do FileUpload. Tanto que não é novidade para mim o artigo que você me enviou. O que eu preciso é fazer exatamente o que o FileUpload faz, sem ter que selecionar arquivo por arquivo. Imagine eu tendo cem arquivos...  selecionar o primeiro e enviar, selecionar o segundo e enviar...até o centésimo! Isso eu fiz com o FileUpload. Entretanto eu gostaria de conhecer uma maneira de como enviar os cem arquivos sem ter que selecionar um a um. Eu poderia usar um programa de FTP, mas dever existir uma maneira de eu fazer isso no próprio software. O diretório de origem pode ser constante se for necessário. O diretório de destino será uma constante. Pegar arquivo por arquivo do diretório eu sei como fazer. Só não sei que comando usar para enviar. O FileUpload não dá porque ele não deixa mudar o FileName. Não entendi o que você quiz dizer com  "vc deve copia-los primeiramente e depois alterar o nome do arquivo. Ao alterar o nome, automaticamente ele muda o FileName.".  Grato Sidney
Responder

Gostei + 0

12/08/2009

Sidney Mendonça/

Olá Luiz.   Favor desconsiderar a ultima mensagem.   Houve um mal entedido.   Vou fazer o projeto de exemplo que veio em anexo.   Voltarei a dar posição.   Acredito ser o que necessito.   Grato.   Sidney    
Responder

Gostei + 0

12/08/2009

Sidney Mendonça/

Olá Luiz. Fiz o programa que você enviou.
É 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
Responder

Gostei + 0

13/08/2009

Luiz Maia

Blz, Sydnei,   Outro recurso que vc pode tentar, é mover os arquivos depois do Upload. Crie duas pastas, e assim que for feito o Upload do arquivo, usando o metodo FileUpload.Move(), mova ele para outro diretorio, entendeu? Assim, não tem como o usuario esquecer de algum, pois todos desta pasta ainda terao que sofrer upload.   Abraços   Att Luiz Maia
Responder

Gostei + 0

13/08/2009

Sidney Mendonça/

OK. Obrigado.
Responder

Gostei + 0

13/08/2009

Sidney Mendonça/

Olá Luiz. Não encontrei esse método move no FileUpload. Grato Sidney  
Responder

Gostei + 0

14/08/2009

Luiz Maia

Desculpe Sydnei, escrevi errado.   Este metodo faz parte do recurso File (System.IO). Seria algo assim:   if (ddlArquivosOrigem.SelectedValue != "") { string ArquivoSelecionado = ddlArquivosOrigem.SelectedValue; string nomeArquivoSelecionado = PastaOrigem + "\\" + ArquivoSelecionado; FileInfo fi = new FileInfo(nomeArquivoSelecionado); // VERIFICA SE EXISTE O ARQUIVO NA PASTA DE ORIGEM if (fi.Exists) { string tipoArquivo = fi.Extension.Replace(".", ""); int codArquivoGerado = arquivo.Salvar(codUsuario); int codDescricao = Convert.ToInt32("0" + ddlDescricao.SelectedValue); DateTime datArquivo = Convert.ToDateTime(tbData.Text); string dscComplemento = tbComplemento.Text; string nomArquivoGerado = String.Format(".", arquivo.BuscarNomeArquivo(codArquivoGerado), tipoArquivo); string caminhoNovoArquivo = String.Format("\\", PastaDestino, nomArquivoGerado); fi.MoveTo(caminhoNovoArquivo); lbMensagem.Text = arquivo.InserirDados(codArquivoGerado, datArquivo, codDescricao, dscComplemento, tipoArquivo); log.WriteLine(String.Format("Inclusão: - Responsavel: - Arquivo: ID_.", DateTime.Now, Session["NomUsuario"].ToString(), codArquivoGerado, tipoArquivo)); } }   Qualquer coisa que não entenda, me avise, ok? Estou aguardando. Abraços Att Luiz Maia
Responder

Gostei + 0

17/08/2009

Luiz Maia

Ola Sydnei,   Como está indo? Aguardo noticias...   Abraços Att Luiz Maia  
Responder

Gostei + 0

19/08/2009

Sidney Mendonça/

Olá Luiz. Apesar de não ser exatamente o que eu queria, fiz o processo da maneira que você sugeriu, e funcionou.
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
Responder

Gostei + 0

20/08/2009

Luiz Maia

Ola Sydnei,   Não tem como fazer isto usando o FileUpload. Tem outras maneiras usando JavaScript caso tenha interesse podemos conversar.   Aguardo Att Luiz Maia
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar