Usuário com melhor resposta
Progress Bar + Upload FTP

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
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
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