none
[RESOLVIDO] Leitura de arquivo de texto utilizando FileUpload RRS feed

  • Pergunta

  • Olá amigos, 

    Estou desenvolvendo uma aplicação que o usuário pega um arquivo de texto no computador dele, faz o upload com o FileUpload e quando clicar no botão "enviar", o arquivo é lido pela aplicação e os dados do arquivo são gravados no banco de dados.

    Localmente, funciona perfeitamente, porém quando eu fiz a publicação na rede para disponibilizar para o usuário utilizar, aparece um erro.

    Segue abaixo o código que funciona localmente:

    protected void btnUpload_Click(object sender, EventArgs e)
            {
                string dataColeta = String.Empty;
                string amostra = String.Empty;
                string exame = String.Empty;
                string metodo = String.Empty;
                string resultado = String.Empty;
                string valorRef = String.Empty;
                string linhaResult = String.Empty;
                int conta = 0;
                string[] lerLinha = null;
                string[] linhas = null;
                
                String Arquivo = Upload.PostedFile.FileName;
                linhas = File.ReadAllLines(Arquivo);
    
                for (int i = 0; i < linhas.Length; i++)
                {
                    linhaResult = linhas[i];
                    lerLinha = linhaResult.Split('|');
                    dataColeta = lerLinha[0];
                    amostra = lerLinha[1];
                    exame = lerLinha[2];
                    metodo = lerLinha[3];
                    resultado = lerLinha[4];
                    valorRef = lerLinha[5];
    
                    linhaResult = String.Empty;
    
                    string queryBusca = "select Conta from tbl1 where PID = '" + amostra.Substring(0, 3) + "'";
    
                    SqlCommand cmd1 = new SqlCommand(queryBusca, conn);
                    conn.Open();
                    conta = (Int32)cmd1.ExecuteScalar();
                    conn.Close();
    
                    string queryInsert = "insert into tbl4 values ('" + dataColeta + "', '" + amostra + "', '" +
                        exame + "', '" + metodo + "', '" + resultado + "', '" + valorRef + "'," + conta + ")";
    
                    SqlCommand cmd2 = new SqlCommand(queryInsert, conn);
                    conn.Open();
                    cmd2.ExecuteNonQuery();
                    conn.Close();
                    msgRetorno.Visible = true;
                    msgRetorno.Text = "Arquivo enviado com sucesso.";
                }
            }

    E abaixo o erro mostrado quando publico a aplicação na web:

    Could not find file 'c:\windows\system32\inetsrv\COLSAN-001.txt'. 

    O arquivo não fica nesse local, pq ele entende que está ali?

    Se houver uma outra forma de ler o arquivo conforme a minha necessidade, ou se estiver incorreto o código, por favor critiquem para que eu possa melhorar.

    Obrigado.


    Cleverson Darsie



    quinta-feira, 5 de setembro de 2013 19:51

Respostas

  • Opa,

    Se você fizer uma pequena modificação no seu código você não precisará mais do StringBuilder:

    while (sr.Peek() >= 0) { linhaResult = sr.ReadLine(); lerLinha = linhaResult.Split('|'); dataColeta = lerLinha[0]; amostra = lerLinha[1]; exame = lerLinha[2]; metodo = lerLinha[3]; resultado = lerLinha[4]; valorRef = lerLinha[5]; linhaResult = String.Empty;

    //continuação da sua logica aqui }

    ou se preferir

    while (sr.Peek() >= 0) { lerLinha = sr.ReadLine().Split('|'); dataColeta = lerLinha[0]; amostra = lerLinha[1]; exame = lerLinha[2]; metodo = lerLinha[3]; resultado = lerLinha[4]; valorRef = lerLinha[5]; linhaResult = String.Empty;

    //continuação da sua logica aqui }

    Ah, não esqueça de marcar o post como Resposta


    Felipe Oliveira



    sexta-feira, 6 de setembro de 2013 15:49

Todas as Respostas

  • Olá Cleverson,

    Isto acontece porque você esta usando a propriedade FileName para ler o Arquivo, isso localmente funciona porque o arquivo esta no mesmo pc onde esta sua aplicação, agora em ambiente real vc não consegue acessar a maquina do usuário para fazer isto.

    Uma solução seria fazer deste jeito:

    //sua logica aqui

    var text = new System.Text.StringBuilder(); using (var sr = new System.IO.StreamReader(Upload.PostedFile.InputStream, System.Text.Encoding.UTF8)) { while (sr.Peek() >= 0) { text.AppendLine(sr.ReadLine()); } } //continuação da sua logica aqui



    Felipe Oliveira

    sexta-feira, 6 de setembro de 2013 11:57
  • Olá Felipe, 

    Entendi o motivo. Obrigado pela explicação.

    Bom, com esse trecho de código que você me enviou eu consegui trabalhar localmente e farei um teste assim que possível aqui dando um retorno.

    Para que funcionasse direito, eu precisava que a StringBuilder ficasse vazia a cada loop, então eu fiz a seguinte alteração no fim do código:

    while (sr.Peek() >= 0)
                    {
                        text.Append(sr.ReadLine());
                        linhaResult = text.ToString();
                        lerLinha = linhaResult.Split('|');
                        dataColeta = lerLinha[0];
                        amostra = lerLinha[1];
                        exame = lerLinha[2];
                        metodo = lerLinha[3];
                        resultado = lerLinha[4];
                        valorRef = lerLinha[5];
    
                        linhaResult = String.Empty;
                        text.Remove(0, text.Length);
                    }

    Minha dúvida é, se eu por acaso tiver um arquivo com 10mil linhas, vai haver algum problema de memória por conta da StringBuilder se eu "zerar" ela dessa forma?

    Obrigado.


    Felipe, 

    Depois de publicar no server com a alteração que você me forneceu, funcionou corretamente.

    Obrigado.




    sexta-feira, 6 de setembro de 2013 12:48
  • Opa,

    Se você fizer uma pequena modificação no seu código você não precisará mais do StringBuilder:

    while (sr.Peek() >= 0) { linhaResult = sr.ReadLine(); lerLinha = linhaResult.Split('|'); dataColeta = lerLinha[0]; amostra = lerLinha[1]; exame = lerLinha[2]; metodo = lerLinha[3]; resultado = lerLinha[4]; valorRef = lerLinha[5]; linhaResult = String.Empty;

    //continuação da sua logica aqui }

    ou se preferir

    while (sr.Peek() >= 0) { lerLinha = sr.ReadLine().Split('|'); dataColeta = lerLinha[0]; amostra = lerLinha[1]; exame = lerLinha[2]; metodo = lerLinha[3]; resultado = lerLinha[4]; valorRef = lerLinha[5]; linhaResult = String.Empty;

    //continuação da sua logica aqui }

    Ah, não esqueça de marcar o post como Resposta


    Felipe Oliveira



    sexta-feira, 6 de setembro de 2013 15:49
  • Perfeito Felipe, 

    Vou utilizar a primeira opção que me deu, pois não consegui deixar o lerLinha vazio, pois se trata de um array.

    Mas está funcionando perfeitamente agora.

    Obrigado.


    Cleverson Darsie

    sexta-feira, 6 de setembro de 2013 17:21