none
Progress Bar + Upload FTP RRS feed

  • Pergunta

  • Tenho o seguinte código para upar uma imagem em um FTP. Queria mostrar uma barra de progresso. Achei um código na net de FTP e outro de progress bar com download. Tentei modificar para ter o que eu quero: FTP + upload. Bom, a imagem é upada normalmente, porém dá uma Exception na hora de chamar o método que atualiza a barra de progresso.
    ERRO nessa linha: this.Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] { reqStream.Length, stream.Length });
    --> reqStream.Length --> "This stream does not support seek operations"
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using FormularioBase;
    using System.Threading;
    using System.Net;
    using System.IO;
    
    namespace Framework.View
    {
        public partial class frmFuncionario : frmBase
        {
            private Thread thread;
            private OpenFileDialog openFile = new OpenFileDialog();
            private Stream reqStream;
            private FileStream stream;
            private static int PercentProgress;
            private delegate void UpdateProgessCallback(Int64 BytesRead, Int64 TotalBytes);
            private string filePath;
            
            public frmFuncionario()
            {
                InitializeComponent();
            }
    
            private void btnUpload_Click(object sender, EventArgs e)
            {
                openFile.Filter = "Imagens|*.jpg;*png|Imagens PNG|*.png|Imagens JPG|*jpg";
                if (openFile.ShowDialog() == DialogResult.OK)
                {
                    filePath = openFile.FileName;
                    picFoto.ImageLocation = filePath;
    
                    thread = new Thread(Upload);
                    thread.Start();
                }
            }
    
            private void UpdateProgress(Int64 BytesRead, Int64 TotalBytes)
            {
                // Calculate the download progress in percentages
                PercentProgress = Convert.ToInt32((BytesRead * 100) / TotalBytes);
                // Make progress on the progress bar
                progressBar.Value = PercentProgress;
                // Display the current progress on the form
                lblProgressBar.Text = "Uploaded " + BytesRead + " de " + TotalBytes + " (" + PercentProgress + "%)";
            }
    
            private void Upload()
            {
                try
                {
                    FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("ftp://aaaaaaaaaa/" + Path.GetFileName(filePath));
                    request.Method = WebRequestMethods.Ftp.UploadFile;
                    request.Credentials = new NetworkCredential("aaaaa", "aaaaa");
                    request.UsePassive = true;
                    request.UseBinary = true;
                    request.KeepAlive = false;
    
                    stream = File.OpenRead(filePath);
                    byte[] buffer = new byte[stream.Length];
                    int bytesSize = 0;
    
                    reqStream = request.GetRequestStream();
    
                    while ((bytesSize = stream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        reqStream.Write(buffer, 0, bytesSize);
                        this.Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] { reqStream.Length, stream.Length });
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Não foi possível concluir a operação\n" + ex.Message, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                finally
                {
                    reqStream.Close();
                    stream.Close();
                }
            }
        }
    }
    


    Get a life. Go party!
    • Editado JobaDiniz segunda-feira, 11 de maio de 2009 21:32
    segunda-feira, 11 de maio de 2009 21:30

Respostas

  • Olá,

    Não cheguei a testar o seu código, mas pelo que vi, quando você chama o método UpdateProgress, você precisa passar o número de bytes lidos até o momento (BytesRead), e o número total de bytes (TotalBytes), para conseguir calcular a porcentagem... Só que você está passando o tamanho do Stream onde está escrevendo a informação, e esse Stream não permite movimentações no cursor...

    Como a leitura do arquivo está do seu lado, acredito que uma solução simples seja ir acumulando os bytes lidos em uma variável, para poder passar para o UpdateProgress. Algo como:

    //...
    
    stream = File.OpenRead(filePath);
    byte[] buffer = new byte[stream.Length];
    int bytesSize = 0;
    
    // Variável que vai acumular os número de bytes lidos
    long bytesRead = 0;
    
    reqStream = request.GetRequestStream();
    
    while ((bytesSize = stream.Read(buffer, 0, buffer.Length)) > 0)
    {
        // Vai acumulando
        bytesRead += bytesSize;
    
        reqStream.Write(buffer, 0, bytesSize);
        this.Invoke(new UpdateProgessCallback(this.UpdateProgress), 
            new object[] { bytesRead /* novo */, stream.Length });
    }
    
    // ...
    



    Abraços,
    Caio Proiete



    Caio Proiete Siga-me no Twitter!
    http://www.caioproiete.com
    • Sugerido como Resposta Rui SantosModerator sexta-feira, 3 de julho de 2009 17:05
    • Marcado como Resposta JobaDiniz sexta-feira, 3 de julho de 2009 17:06
    quarta-feira, 1 de julho de 2009 03:28
    Moderador