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

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
 
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 :)
 
_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.
 
_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.

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 :)
 
_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
 
_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

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.
 
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
 
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
 
Código:
Dim OFDlocation As String = openFileDialog1.FileName
Portanto a variavel ODFlocation refere-se à imagem escolhida no OpenFileDialog.

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.


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

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

Não percebi muito bem esta parte...
 
_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?
 
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.
 
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
 
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
 
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
 
Back
Topo