UPLOAD

06/08/2009

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/

Curtidas 0

Respostas

Luiz Maia

Luiz Maia

06/08/2009

Ola Sydnei,
GOSTEI 0
Luiz Maia

Luiz Maia

06/08/2009

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      
GOSTEI 0
Sidney Mendonça/

Sidney Mendonça/

06/08/2009

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
GOSTEI 0
Luiz Maia

Luiz Maia

06/08/2009

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
GOSTEI 0
Luiz Maia

Luiz Maia

06/08/2009

Ola Sydnei, como esta indo? Aguardo retorno   Att Luiz Maia
GOSTEI 0
Sidney Mendonça/

Sidney Mendonça/

06/08/2009

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
GOSTEI 0
Sidney Mendonça/

Sidney Mendonça/

06/08/2009

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    
GOSTEI 0
Sidney Mendonça/

Sidney Mendonça/

06/08/2009

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
GOSTEI 0
Luiz Maia

Luiz Maia

06/08/2009

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
GOSTEI 0
Sidney Mendonça/

Sidney Mendonça/

06/08/2009

OK. Obrigado.
GOSTEI 0
Sidney Mendonça/

Sidney Mendonça/

06/08/2009

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

Luiz Maia

06/08/2009

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
GOSTEI 0
Luiz Maia

Luiz Maia

06/08/2009

Ola Sydnei,   Como está indo? Aguardo noticias...   Abraços Att Luiz Maia  
GOSTEI 0
Sidney Mendonça/

Sidney Mendonça/

06/08/2009

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
GOSTEI 0
Luiz Maia

Luiz Maia

06/08/2009

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
GOSTEI 0
Sidney Mendonça/

Sidney Mendonça/

06/08/2009

OK Luiz.   Gostaria que me instruisse como fazer mesmo que seja em JavaScript. Devemos encerrar esse chamado e  abrir outro?   Grato   Sidney  
GOSTEI 0
Luiz Maia

Luiz Maia

06/08/2009

Pode ser neste chamado mesmo. Vou te mandar um exemplo, ok?   Ate mais... Luiz Maia
GOSTEI 0
Sidney Mendonça/

Sidney Mendonça/

06/08/2009

OK. Fico no aguardo. Muito obrigado. Sidney  
GOSTEI 0
Luiz Maia

Luiz Maia

06/08/2009

Ola Sydnei,   Estou pensando na solução que vc precisa e me veio a ideia de usar o FTP do .net. Acho que com isto vc consegue fazer os upoloads de todos os arquivos de uma pasta.     Pode usar o exemplo abaixo, em vb.net:   <asp:Label ID="lblMsg" runat="server"  /><br /><br /> <asp:Button ID="cmdUpload" Text="Upload" runat="server" />   Public Sub uploadFileUsingFTP(ByVal CompleteFTPPath As String, ByVal CompleteLocalPath As String, Optional ByVal UName As String = "",  Optional ByVal PWD As String = "")   'Create a FTP Request Object and Specfiy a Complete Path  Dim reqObj As FtpWebRequest = WebRequest.Create(CompleteFTPPath)   'Call A FileUpload Method of FTP Request Object  reqObj.Method = WebRequestMethods.Ftp.UploadFile   'If you want to access Resourse Protected You need to give User Name      and PWD  reqObj.Credentials = New NetworkCredential(UName, PWD)   'FileStream object read file from Local Drive  Dim streamObj As FileStream = File.OpenRead(CompleteLocalPath)   'Store File in Buffer  Dim buffer(streamObj.Length) As Byte   'Read File from Buffer  streamObj.Read(buffer, 0, buffer.Length)   'Close FileStream Object Set its Value to nothing  streamObj.Close()  streamObj = Nothing   'Upload File to ftp://localHost/ set its object to nothing  reqObj.GetRequestStream().Write(buffer, 0, buffer.Length)  reqObj = Nothing   End Sub No cmdUpload_Click adicione o seguinte codigo:   Protected Sub cmdUpload_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdUpload.Click   'On button Click call the function 'and Pass Parameter Values 'Display Message on Success   uploadFileUsingFTP("ftp://localhost/ftp1.txt", "C:\Documents and Settings\Administrator\Desktop\ftp.txt") lblMsg.Text = "File Uploaded Successfully :)"   End Sub   Aguardo um retorno seu. Abraços Att Luiz Maia
GOSTEI 0
Sidney Mendonça/

Sidney Mendonça/

06/08/2009

Olá Luiz. Obrigado pela informação. É exatamente isso que precisava. Vou implementá-la e lhe dou um retorno. []s Sidney    
GOSTEI 0
Luiz Maia

Luiz Maia

06/08/2009

Ok Sydney,   Aguardo seu feedback apos a implementação. Caso haja alguma duvida, não exite em me contactar.   Abraços Att Luiz Maia
GOSTEI 0
Sidney Mendonça/

Sidney Mendonça/

06/08/2009

Olá Luiz. Você teria esse exemplo em C#? Eu não consegui traduzir alguns comandos, Grato Sidney
GOSTEI 0
Luiz Maia

Luiz Maia

06/08/2009

Sydnei,   É so chamar a função abaixo para arquivo dentro do loop foreach do Directory.getFiles():   private void Upload(string filename) { FileInfo fileInf = new FileInfo(filename); string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name; FtpWebRequest reqFTP; // Create FtpWebRequest object from the Uri provided reqFTP = (FtpWebRequest)FtpWebRequest.Create (new Uri("ftp://" + ftpServerIP + "/" + fileInf.Name)); // Provide the WebPermission Credintials reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); // By default KeepAlive is true, where the control connection // is not closed after a command is executed. reqFTP.KeepAlive = false; // Specify the command to be executed. reqFTP.Method = WebRequestMethods.Ftp.UploadFile; // Specify the data transfer type. reqFTP.UseBinary = true; // Notify the server about the size of the uploaded file reqFTP.ContentLength = fileInf.Length; // The buffer size is set to 2kb int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; // Opens a file stream (System.IO.FileStream) to read the file // to be uploaded FileStream fs = fileInf.OpenRead(); try { // Stream to which the file to be upload is written Stream strm = reqFTP.GetRequestStream(); // Read from the file stream 2kb at a time contentLen = fs.Read(buff, 0, buffLength); // Till Stream content ends while (contentLen != 0) { // Write Content from the file stream to the FTP Upload // Stream strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); } // Close the file stream and the Request Stream strm.Close(); fs.Close(); } catch(Exception ex) { MessageBox.Show(ex.Message, "Upload Error"); } } AbraçosAtt
Luiz Maia
GOSTEI 0
Sidney Mendonça/

Sidney Mendonça/

06/08/2009

Olá Luiz.   Funcionou perfeitamente. Foi uma excelente solução. Obrigado pela atenção. Chamado encerrado.   []s   Sidney
GOSTEI 0
Luiz Maia

Luiz Maia

06/08/2009

Sydnei,   Precisando, é so falar. Continuamos a sua disposição ok? Abraços   Att Luiz Maia
GOSTEI 0
Sidney Mendonça/

Sidney Mendonça/

06/08/2009

Chamado concluído.   Obrigado.
GOSTEI 0
Sidney Mendonça/

Sidney Mendonça/

06/08/2009

Chamado concluído.   Obrigado.
GOSTEI 0
POSTAR