Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Matuzalém Teles

Enviar arquivos via FTP

Recommended Posts

Galera como falei ali em encima eu tenho um programa que tira as prints e salva em uma pasta mais quero que invés de salvar ele envia pro Host via FTP ou outro método e salva lá no host.

Meu código para se conectar via FTP e este:

        Dim request As System.Net.FtpWebRequest = DirectCast(System.Net.WebRequest.Create("ftp://nome do host e caminho"), System.Net.FtpWebRequest)
        request.Credentials = New System.Net.NetworkCredential("Usser", "Senha")
        request.Method = System.Net.WebRequestMethods.Ftp.UploadFile

        Dim file() As Byte = System.IO.File.ReadAllBytes("a pasta onde esta o arquivo para enviar.")

        Dim strz As System.IO.Stream = request.GetRequestStream()
        strz.Write(file, 0, file.Length)
        strz.Close()
        strz.Dispose()
E galera este e meu código para tirar um print da tela.

 

    Private Sub salvaTela()
        Dim caminho As String = "caminho onde salva no PC"
        Try
            Dim ScreenSize As Size = New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
            Dim screenGrab As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
            Dim g As Graphics = FromImage(screenGrab)

            g.CopyFromScreen(New Point(0, 0), New Point(0, 0), ScreenSize)
            screenGrab.Save(caminho & "Print" &.jpg", Imaging.ImageFormat.Jpeg)

        Catch ex As Exception
            MsgBox("Erro : " & ex.Message)
        End Try
Ai galera quero que toda vez que tirar a print invés de salvar no pc envia pro host e salva.

 

Agradeço pela atenção!

Compartilhar este post


Link para o post
Compartilhar em outros sites

jogue o código de envio para ftp em um método, jogue esse seu bitmap em um memorystream para poder pegar os bytes dele, é só você fazer isso:

 

dim ms as new IO.MemoryStream() //cria o memory stream
ms.open() //abre o ms
screenGrab.Save(ms, Imaging.ImageFormat.Jpeg) //salva a imagem na memória
ms.close() //fecha o stream
dim filebytes as byte() = ms.toArray() //transforma em bytes

 

Ou olhe aqui:

http://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-array-in-c

http://bytes.com/topic/visual-basic-net/answers/368879-memorystream-bytearray-bitmap

http://www.vbforums.com/showthread.php?358917-Converting-a-bitmap-to-a-byte-array

 

Ai seu método de envio para ftp vai ficar o seguinte:

 

 

public function sendToFTP(file as byte())


Try   
     
Dim request As System.Net.FtpWebRequest = DirectCast(System.Net.WebRequest.Create("ftp://nome do host e caminho"), System.Net.FtpWebRequest)
        request.Credentials = New System.Net.NetworkCredential("Usser", "Senha")
        request.Method = System.Net.WebRequestMethods.Ftp.UploadFile


        Dim strz As System.IO.Stream = request.GetRequestStream()
        strz.Write(file, 0, file.Length)
        strz.Close()
        strz.Dispose()


Return 1


Catch e as exception
return 0


End Try


end function

Ai é só você chamar ele assim na sua função

 

 

dim ms as new IO.MemoryStream() 
ms.open()
screenGrab.Save(ms, Imaging.ImageFormat.Jpeg)
ms.close()
dim filebytes as byte() = ms.toArray()
sendToFTP(filebytes)

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo obrigado pela ajuda.

Estou desenvolvendo em VB.NET VS 2013.

 

Estou min complicando neste código

dim ms as new IO.MemoryStream() //cria o memory stream
ms.open() //abre o ms
screenGrab.Save(ms, Imaging.ImageFormat.Jpeg) //salva a imagem na memória
ms.close() //fecha o stream
dim filebytes as byte() = ms.toArray() //transforma em bytes

Onde eu colocaria ele?

Em um modulo.

 

Olha só estou usando assim:

    Private Sub salvarTela()
        Dim ms As New IO.MemoryStream()
        Dim screenGrab As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
        Dim ScreenSize As Size = New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)

        ms.open()
        Dim g As Graphics = FromImage(screenGrab)
        g.CopyFromScreen(New Point(0, 0), New Point(0, 0), ScreenSize)
        screenGrab.Save(ms, Now.Hour & "h" & "." & Now.Minute & "m" & "." & Now.Second & "s" & ".jpg", Imaging.ImageFormat.Jpeg)
        ms.Close()
        Dim filebytes As Byte() = ms.ToArray()
        sendToFTP(filebytes)
    End Sub

o ms.open não vai.

e da erro por causa do ms junto com o método &

.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não precisa colocar o nome da imagem no memory Stream, você só vai precisar disso na hora de salvar no servidor FTP, você deve ter um caminho de servidor para salvar.

 

 

    Private Sub salvarTela()


        Dim ms As New IO.MemoryStream()
        Dim screenGrab As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
        Dim ScreenSize As Size = New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)


        Dim g As Graphics = FromImage(screenGrab)
        g.CopyFromScreen(New Point(0, 0), New Point(0, 0), ScreenSize)
        screenGrab.Save(ms, Imaging.ImageFormat.Jpeg)
        ms.Close()
        Dim filebytes As Byte() = ms.ToArray()


       if sendToFTP(filebytes) = 1 Then
MsgBox("Seu arquivo foi enviado com sucesso")
  Else
   MsgBox("Erro de envio")
  End If
  
    End Sub

 

Você criou o método sendToFTP?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basicamente, só que você precisaria do caminho do arquivo de texto, se você tiver um arquivo de texto para enviar para o FTP a função ficaria assim:

 

 

    Private Sub salvarArquivo()


        Dim filebytes As Byte() = File.ReadAllBytes(<caminho>)


       if sendToFTP(filebytes) = 1 Then
MsgBox("Seu arquivo foi enviado com sucesso")
Else
MsgBox("Erro de envio")
End If
  
    End Sub

Se você quiser enviar só o texto você precisaria criar o arquivo lá.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum, mais tipo o que to fazendo aqui e pegar os processos do pc com a StreamWriter para gravar em cada e salvar mais como os nomes dos arquivos não são todos iguais e quero que ele salve direto no host e não no pc.

Compartilhar este post


Link para o post
Compartilhar em outros sites

você vai ter que pegar esse texto todo que você quer e salvar em uma variável, depois você vai ter que criar um arquivo de texto usando esta variável, você pode criar em uma pasta do sistema como um arquivo temporário, depois você pega este arquivo como eu mostrei acima e transforma ele em bytes, ai você pode deletar o arquivo do sistema e enviar os bytes pela função do FTP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, eu te dei a lógica completa, procura no google que você vai encontrar, vou até deixar um código de exemplo que cria um arquivo de texto em bytes aqui para você:

 

 

private void SendLog()
        {
            string text = ""; //cria variável que vai receber o texto


            for (int i = 0; i < lbmessage.Items.Count; i++) //Montagem do texto do arquivo
            {
                text = text + lbmessage.Items[i].ToString() + Environment.NewLine;
            }


            MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(text)); // adicionando o arquivo em um memoryStream
byte[] filebytes = ms.toArray(); //Transformando o arquivo em um array de bytes
        }

Essa função foi para um programa que precisei fazer que enviava um email montando um arquivo direto na memória, use os códigos disponíveis e faça a adaptação para o seu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok Vlw, Consegui fazer aqui a adaptação só que agora ele salva sim os arquivos que quero como eu desejo, mais salva todos os arquivos encima da linha ou seja e para salvar em um nova linha.

Exemplo:

Pro1 -

Pro2 -

 

Isto são os processos abertos que vão ser gravados no arquivo txt em uma nova linha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não foi de uma olhada na parte do código.

 

        Dim text As String = "" 'cria variável que vai receber o texto
        Dim todosProc() As Process = Process.GetProcesses() 'crie um array com os processos atuais

        For Each processo As Process In todosProc
            text = (processo.ProcessName & " - " & processo.MainWindowTitle + Environment.NewLine) 'grava lista de processos no arquivo
        Next processo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não cara, o meu código está em C# e o concatenador no C# é o + no seu caso você coloca o &

 

text = processo.ProcessName & " - " & processo.MainWindowTitle & Environment.NewLine

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque você não está concatenando o texto que você já fez:

 

text = texto & processo.ProcessName & " - " & processo.MainWindowTitle & Environment.NewLine

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.