1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[VB 2008] Upload de imagens para base de dados [AJUDA]

Discussão em 'Programação' iniciada por lcortereal, 27 de Fevereiro de 2009. (Respostas: 14; Visualizações: 3667)

  1. lcortereal

    lcortereal Power Member

    Boas, estou a fazer um projecto escolar em VB 2008, que será para uma empresa de figurantes. A form de "adicionar novos figurantes" inclui o nome, data de nascimente, altura, peso, etc, que não foi dificil fazer com que estes dados fossem introduzidos na base de dados (Access). O meu problema surge quando, na mesma Form, preciso de fazer upload de fotos do figurante para a base de dados.

    Estou ciente de que existem duas formas de o fazer:

    1ª -» Adicionar directamente a imagem para a base de dados num campo OLE Object. Mas desta forma ocupa muito espaço na base de dados e isso pode vir a dar problemas.

    2ª -» Copiar a imagem para uma pasta/subpasta no directorio do programa e incluir apenas na base de dados a localização da imagem. Penso que esta será a melhor maneira de o fazer, e o mesmo me foi dito por professores desta disciplina, colegas, e li tambem noutros forums.


    O problema surge quando chega a altura de o fazer xD! Encontrei umas linhas de código num fórum cujo propósito é exactamente este, mas aquilo foi "traduzido" de C# para VB .NET e quando eu meto aquilo no VB dá me erros atrás de erros!

    Caso ajude eu posso postar aqui as linhas de código ou mesmo o link para o outro fórum (inglês).

    Alguem me consegue ajudar nisto? Estou à 3 semanas com o projecto parado por ter empancado nisto e não consigo arranjar nada de jeito na net.

    Agradeço desde já,
    LCorteReal
     
  2. _freelancer_

    _freelancer_ Power Member

    Isto não tem muito que se lhe diga.

    A primeira coisa a fazer é obviamente escolher o método que vais adoptar:
    - Armazenar na BD ou Armazenar em ficheiros.

    Qualquer dos métodos tem vantagens e desvantagens que terás de considerar na tua escolha.

    Com isto feito, tens este link.

    É para uma base de dados Oracle e em C#, mas é muito fácil adaptar o código.

    O método que precisas é o private void btnbrowse_Click(object sender, System.EventArgs e){(...)} que é o Event Handler do evento Click de um botão normal.

    A ideia principal é abrir o ficheiro e inseri-lo na base de dados, caso decisas alojar lá os ficheiros.

    Caso optes pela outra opção, então ainda melhor. Só precisas de mover o ficheiro para uma pasta tua e depois precisas de guardar o caminho para o ficheiro e/ou o nome do ficheiro. Nada mais fácil :)
     
  3. lcortereal

    lcortereal Power Member

    _freelancer_ não me queres dar uma ajudinha nisto sff. Eu vou optar pelo metodo de alojar a imagem numa pasta dentro do directorio do programa, mas nao faço a menor ideia de como mandar para la a imagem, nem de como copiar a sua localização para a base de dados.
     
  4. _freelancer_

    _freelancer_ Power Member

    Posso tentar ajudar :)

    Para começar tens estas duas classes que são basicamente tudo o que vais precisar:

    - File
    e
    - FileInfo

    Com elas consegues abrir ficheiros, obter informações de ficheiros... enfim, tudo.

    Para mostrares uma janela ao utilizador, vais precisar também de um OpenFileDialog que também é muito simples de usar, e nesse link explica.

    Mais dúvidas concretas, apita :)
     
  5. lcortereal

    lcortereal Power Member

    _freelancer_, com esses links fiquei com uma ideia muito mais clara do que tenho que fazer. Eu neste momento tou a fazer um "rascunho" do projecto. É só uma pequena applicação onde meto: Nome, data de nascimento, altura e uma foto. Estou a fazer esta pequena aplicaçao para testar e experimentar novas classes e comandos que não conhecia, e para fazer as ligações com a BD, etc. No entanto já tinha conseguido fazer com que quando carregasse no botão "Browse", abrisse o OpenFileDialog (ainda sem filtros de extensoes dos ficheiros jpg, png, etc), e quando escolhesse a imagem a localização desta fosse mostrada numa TextBox.

    Agora tenho que com a classe File e FileInfo, copiar o ficheiro dessa localização (mostrada na textbox) para uma subpasta do prgrama, e gravar essa localização na BD.

    Depois de teres postado ai esses links fiquei com a ideia de que isto é mais facil do que pensava xD
     
  6. _freelancer_

    _freelancer_ Power Member

    Com a framework .NET há uma quantidade de coisas que são mais fáceis do que parecem :)

    Copiar ficheiros é tão simples quanto File.Copy() e para tal basta mesmo saber o nome do ficheiro.

    Se precisares de mais ajuda, avisa.
     
  7. lcortereal

    lcortereal Power Member

    Boas, com o codigo:



    consegui copiar a imagem APC.jpg do directorio "C:\Users\Luis\Pictures\" para "C:\testdirectory\apc.jpg". No entanto o que eu queria era o seguinte:

    Quando carrego no botao Procurar imagem, aparece um OpenFileDialog, escolho a imagem e depois a localizacao inicial da imagem é mostrada numa textbox.
    Usei o seguinte comando para definir uma variavel:
    Código:
    Dim OFDlocation As String = openFileDialog1.FileName
    Portanto a variavel ODFlocation refere-se à imagem escolhida no OpenFileDialog.

    Mas quando carrego no botao Submit Form queria fazer algo do genero:

    Código:
    Dim path As String = OFDlocation
    Dim testdirectory As String = "c:\testdirectory\"
    
            My.Computer.FileSystem.CopyFile( _
               path, _
               testdirectory)
    
    Mas surgem pelo menos 2 problemas:

    1º - Nao posso copiar para testdirectory, teria que ser testdirectory\&(nome do ficheiro) mas nao sei como separar apenas o nome do ficheiro(+extensao) do URL inteiro da imagem.

    2º - No seguinte código
    Código:
    Dim path As String = OFDlocation
    estou me a referir a uma variavel que foi definida noutra class: quando se carrega no botao Procurar imagem, e não no Submit Form.
    Existe alguma maneira para me refeir a variaveis que foram definidas noutras "seccoes"?

    Agradeço desde já,
    LCorteReal
     
  8. alfinete

    alfinete Power Member

    isso tens de utilizar um fcomponente file upload no c# , e um botão a parte para fazer upload, depois o caminho que guardas na bd ou é o texto que esta na caixa de texto quando puchaste o ficheiro atraves do fileupload,ou o file upload onde fazes qualquer coisa do tipo fileuplaod.filename, e depois o resto do caminho es tu que defines atraves de uma string do tipo "c:/ ......./ "+fileupload.filename...
    em c# asp.net

    chamar o caminho do web config para onde fazes o upload

    Código:
      private string upload = ConfigurationManager.AppSettings.Get("caminhoupload");
    caminho para onde fazes upload no web config


    Código:
      
          <add key="caminhoupload" value="z:\SabaticaDocumentos"/>
    
          tamanho maximo do file
    
    
      <add key="tamanhofile" value="1240000" />
    
    
    tens ai um conjunto de metodos para fazeres o upload




    não necessitam de alteração é so passar os parametros correstos

    Código:
    
    
     #region upload
    
                        /************************upload************************************/
                        // verifica o ficheiro puxado para upload em termos de string (vazio ou n)
                        // tipo, tamanho,nometamanho
                        // string fileup -  "nomefileupload.FileName.ToString()"
                        // string tipo -"tipo de ficheiro a ser aceite"
                        // ficheiro_up - nome do componente de fileupload
                        //nometamanho - puxa uma string com a descrição do tamanho maximo permitido
                        // Tamanho - tamanho maximo premiido no upload
                        // obriga 0/1 conforme campo seja n obrigatorio/obrigatorio
                        public bool Vupload(string fileup, System.Web.UI.WebControls.Label lbl, System.Web.UI.WebControls.Label lbl2, string tipo, System.Web.UI.WebControls.FileUpload ficheiro_up, int tamanho, string nome_tamanho,int obriga)
                        {
                          bool resul = true;
    
    
                          // Valida se caixa de texto esta vazia
                          if (fileup == "")
                          {
                            if(obriga==0)
                                {
                                 lbl.Text = "<span class=\"erroverdade\">*</span>";
                                 lbl2.Text = "";  
                                }
                                else
                                    {
                                  lbl.Text = "<span class=\"errofalso\">*</span>";
                                  lbl2.Text ="";
                                  resul = false;                                                   
                                    }
                          }
    
                          // Valida se caixa de texto não esta vazia
                          if (fileup != "")
                          {
    
                            // Valida se o documento puxado do tipo escolhido
                            if (validaformato(fileup) == tipo)
                            {
                              // verifica se o tamanho do mesmo file é menor que o tamenho maximo escolhido
                              if (ficheiro_up.PostedFile.ContentLength <= Convert.ToInt32(tamanho))
                              {
    
                                lbl.Text = "<span class=\"erroverdade\">*</span>";
                                lbl2.Text = "";   
                              }
                              //caso contrario
                              else
                              {
                                lbl.Text = "<span class=\"errofalso\">*</span>";
                                lbl2.Text = "Tamanho máximo : 2 mgs";
                                resul = false;
                              }
                            }
    
                            // Valida se o documento puxado não é jpg 
                            if (validaformato(fileup) != tipo)
                            {
                              lbl.Text = "<span class=\"errofalso\">*</span>";
                              lbl2.Text = " Só Aceita ficheiros do tipo:   " + tipo.Substring(1,3) ;
                              resul = false;
                            }
    
                          }
    
                          return resul;
                        }
    
                        //faz o upload chamando [grava_upLoad] chamando o nome do componente inserido
                        public bool upLoad(System.Web.UI.WebControls.FileUpload ficheiro_up)
                        {
    
                          bool resul = true;
    
    
                          //***** temporariamente inibido
    
                          string base_path_dir;
                          HttpPostedFile httppf = null;
                          // HttpPostedFile httppf_decisoes2;
    
                          int nFileLen;
    
                          //, nFileLen2
    
                          byte[] myData;
                          //,myData2
    
                          //testa_upLoad();
    
                          base_path_dir = @"" + upload;
                          //***** UpLoad file - 
    
                          httppf = ficheiro_up.PostedFile;
    
                          string strFilename_pro = base_path_dir + @"\" + Path.GetFileName(ficheiro_up.PostedFile.FileName);
    
                          nFileLen = httppf.ContentLength;
    
                          myData = new byte[nFileLen];
    
                          httppf.InputStream.Read(myData, 0, nFileLen);
    
                          grava_upLoad(strFilename_pro, myData);
    
                          return resul;
    
                        }
    
                        // faz a gravação do upload
                        private bool grava_upLoad(string strPath, byte[] Buffer)
                        {
                          FileStream newFile;
                          bool resul = true;
                          // Create a file
    
                          newFile = new FileStream(strPath, FileMode.Create);
                          // Write data to the file
                          newFile.Write(Buffer, 0, Buffer.Length);
    
                          newFile.Close();
                          return resul;
                        }
    
                        // capta os ultimos 4 caractres (formato da imagem ) para a string palavra
                        private string validaformato(string str)
                        {
                          string palavra;
                          palavra = str.Substring(str.Length - 4);
                          return palavra;
                        }
             
               #endregion
    
    
    desenvolvido em vstudio 2005

    espero que tenha ajudado
     
  9. _freelancer_

    _freelancer_ Power Member

    Atenção que isto apenas é valido DEPOIS de teres usado o OpenFileDialog. Isto é, se fizeres essa atribuição antes de mostrares o OpenFileDialog, quando o utilizador fizer a escolha dele não vais ficar com o nome do ficheiro.


    Código:
    Dim URLInteiro as String 'Assume que esta variavel tem o URL inteiro.
    
    Dim NomeFicheiro as String = URLInteiro.Split("\").Last()
    
    Nota: só funciona a partir do .NET 3.0, uma vez que usa LinQ com a chamada ao Last(), mas a ideia é que vás buscar o último elemento do array devolvido pelo Split(), esse será o nome do ficheiro.

    Não percebi muito bem esta parte...
     
  10. lcortereal

    lcortereal Power Member

    _freelancer_ ve se percebes melhor assim:

    o codigo que se segue refere-se ao que acontece quando o botao UploadFile é carragado (o botao de pesquisar)

    Código:
    Private Sub UploadFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UploadFile.Click
            Dim myStream As Stream = Nothing
            Dim openFileDialog1 As New OpenFileDialog()
    
            openFileDialog1.InitialDirectory = "c:\"
            openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"
            openFileDialog1.FilterIndex = 2
            openFileDialog1.RestoreDirectory = True
    
            If openFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
                Try
                    myStream = openFileDialog1.OpenFile()
                    If (myStream IsNot Nothing) Then
                        ' Insert code to read the stream here.
                    End If
                Catch Ex As Exception
                    MessageBox.Show("Cannot read file from disk. Original error: " & Ex.Message)
                Finally
                    ' Check this again, since we need to make sure we didn't throw an exception on open.
                    If (myStream IsNot Nothing) Then
                        myStream.Close()
                    End If
                End Try
            End If
    
    
            Dim OFDlocation As String = openFileDialog1.FileName
            txt_ofdlocation.Text = OFDlocation
    
        End Sub
    
    E o codigo que se segue agora refere-se ao que acontece quando o botao Submit e carregado
    (nao pus o codigo todo deste visto que tambem incluia a ligaçao com a base de dados para meter la os outros dados tais como nome, idade, etc, e essa parte do codigo nao e relevante):

    Código:
        Private Sub btn_submit_Click() Handles btn_submit.Click
            Dim path As String = OFDlocation
            Dim testdirectory As String = "c:\testdirectory\"
            ' Copy the file to a new location without overwriting existing file.
            My.Computer.FileSystem.CopyFile( _
                path, _
                testdirectory)
    
    _freelancer_ como podes ver a variavel (string)) ODFlocation foi definida no UploadFile_Click, e nao no btn_submit_Click(), por isso da erro quando eu chamo a variavel ODFlocation no btn_submit_Click(), visto que esta so esta disponivel no UploadFile_Click. Como e que eu posso dar a volta a coisa?
     
  11. _freelancer_

    _freelancer_ Power Member

    Pessoalmente eu declarava o openFileDialog1 como membro da classe onde estás a programar.

    Código:
    Public Class Form1
        Private openFileDialog1 As OpenFileDialog = New OpenFileDialog()
    
        ' Metodos vão aqui
    End Class
    Assim podes aceder ao openFileDialog1 nos métodos que bem entenderes :)

    Ou seja, um botão faz com que o openFileDialog1 seja mostrado, o outro vai aceder a openFileDialog1.FileName.
     
  12. lcortereal

    lcortereal Power Member

    Alfinete, so vi agora a tua resposta. Obrigado pela ajuda mas o codigo que me deste esta em C# e a sintaxe e diferente de VB. Eu no outro dia encontrei umas linhas de codigo (prai 50 :P) para fazer upload de imagens, que originalmente eram de C# mas foi convertido para VB. No entanto e preciso estar a mudar muita coisa, tal como os nomes de butoes, textboxes, etc... E eu prefiro fazer o codigo "sozinho" (com a vossa ajuda LOL). Visto que desta maneira aprendo melhor. Eu no fundo sei os passos todos que preciso que o programa desempanhe para fazer isto, mas quando chega a altura de programar e que se complica um bocado... xD
     
  13. alfinete

    alfinete Power Member

  14. lcortereal

    lcortereal Power Member

    Alfinete, é impressão minha ou o codigo que me deste esta em ASP e nao em C#? Nao percebo nem de uma linguagem nem de outra. Secalhar ate da para juntar as duas :s
     
  15. alfinete

    alfinete Power Member

    Código:
    <add key="caminhoupload" value="z:\SabaticaDocumentos"/>
    
          tamanho maximo do file
    
    
      <add key="tamanhofile" value="1240000" />

    aqui crias duas variaveis em vb

    tamnho max do ficheiro a fazer upload
    dim tamanhomax as string = "1240000"

    camminho para onde queres que seja feito o upload
    dim caminho as string =" z:\SabaticaDocumentos";

    para este metodo

    public bool Vupload(string fileup, System.Web.UI.WebControls.Label lbl, System.Web.UI.WebControls.Label lbl2, string tipo, System.Web.UI.WebControls.FileUpload ficheiro_up, int tamanho, string nome_tamanho,int obriga)

    neste metodo onde tens lbl.Text = "<span class=\"erroverdade\">*</span>";

    poes lbl.Text = "tua mensagem de erro";

    utilizar metodo

    Vupload(nomefileupload.FileName.ToString(),nome da label de erro,".pdf",nome do controlo de upload,....);

    onde ".pdf", podes por".doc" ou outro , caso queiras para mais tens de alterar o metodo
    nometamanho e tamanho , podem ser iguais no teu caso ou tiras um e alteras o metodo

    ___________________________________________




    //faz o upload chamando [grava_upLoad] chamando o nome do componente inserido
    public bool upLoad(System.Web.UI.WebControls.FileUpload ficheiro_up)

    este metodo alteras para public bool upLoad(System.Web.UI.WebControls.FileUpload ficheiro_up,string uploas)

    chamar metodo

    upLoad(nome do componemte de upload, caminho)


    os outros metodos não alteras
    .........

    espero ter ajudado
     

Partilhar esta Página