• Domingo 22 de Diciembre de 2024, 19:02

Autor Tema:  Validar Extension Del Archivo  (Leído 3095 veces)

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Validar Extension Del Archivo
« en: Miércoles 1 de Febrero de 2006, 20:13 »
0
Hola que onda..

unda duda, yo tengo un CommonDialog que abre la ventanita para buscar un archivo de Imange, busca archivos JPG aunque tambien se permite GIF, BMO y PNG, pero el caso es que a pesar de indicar *.JPG esto puede presentar un error.

Se supone que el usuario busca una foto por esta ventanita del CommonDialog y luego de tener el archivo se abre una ventana FrmFoto de forma Modal la cual muestra en un Picture la foto.  Pero si por pura casualidad, el usuario busca un archivo de otra extension, sea .txt, .doc, etc.. es decir que no es ni .jpg, ni nada de imagen, pues al llegarse al codigo del Picture, se produce un error.

Este es el codigo del ComonDialog:
Código: Text
  1.  
  2.     With CommonDialog1
  3.         .DialogTitle = "Buscando Foto"
  4.         .CancelError = False
  5.         .Filter = "Todos los archivos (*.JPG)|*.JPG"
  6.         .ShowOpen
  7.         If Len(.FileName) = 0 Then
  8.             File = ""
  9.             Exit Sub
  10.         End If
  11.         If CommonDialog1.FileName = "" Then
  12.             File = ""
  13.             Exit Sub
  14.         End If
  15.         File = .FileName
  16.     End With
  17.     FrmFoto.Show vbModal
  18.  
  19.  

Bueno evite el error asi:
Código: Text
  1.  
  2. On Error GoTo errorhandler
  3.  
  4. 'AQUI CODIGO ETC..
  5.  
  6. 'Formato de archivo de imagen incorrecto (.txt, doc, etc...)
  7. errorhandler:
  8.     If Err.Number Then 'Error: 481
  9.         MsgBox("Formato de Archivo Incorrecto, verifique")
  10.     End If
  11.  
  12.  

Realmente cualquier error raro que suceda con el Picture sacara ese aviso, pero en un alto porcentaje el error en el Picture seria ese, buscar un archivo que no sea de imagen, asi que se ataja con eso y saca el aviso, ahi todo bien.

Pero existe un problemita, resulta que el programa tiene un codigo que valida si el archivo buscado por el CommonDialog existe o no, el cual es este:

Si existe el archivo, se guardó y está ahi para consultas del registro con Foto en la carpeta "Fotos":
Código: Text
  1.  
  2.     'Foto encontrada (si existe en la carpeta Fotos):
  3.     If Dir(App.Path & "\Imagenes\Fotos\" & strNombre & ".JPG") <> "" Then
  4.         'FrmPrincipal.PictureX.Picture = LoadPicture(Dir(App.Path & "\Imagenes\Fotos\" & strNombre & ".JPG"))
  5.         FrmPrincipal.PictFoto.Picture = LoadPicture(App.Path & "\Imagenes\JPG\Fondo_Foto.JPG")
  6.         FrmPrincipal.PictureX.Picture = LoadPicture(App.Path & "\Imagenes\Fotos\" & strNombre & ".JPG")
  7.         Call Stretchpic2(FrmPrincipal.PictureX, FrmPrincipal.PictFoto)
  8.         Exit Sub
  9.     Else 'El Archivo No Existe (No Encontrado)
  10.         FrmPrincipal.PictFoto.Picture = LoadPicture(App.Path + "\Imagenes\Fotos\Foto.JPG")
  11.     End If
  12.  
  13.  

entonces obviamente el archivo (.txt, .doc, etc...) si existe por lo que el programa procede a hacer una copia del archivo en una carpeta llamda "Fotos" dentro de la carpeta del programa.  No es un archivo de imagen pero como si existia el archivo sea TXt o otro formato, pues lo guardó... y al cargarse el FrmFoto con el Picture produce error.

Entonces...
Frene el error de cargarse el archivo (no imagen) en el Picture al buscarlo por el CommonDialog y asociarlo al registro del cliente, pero como el programa si guardo el archivo porque si existe, luego al hacerle una consulta al registro de este cliente, el programa busca la foto, consigue el archivo Txt o X formato e intenta con la consulta cargar la imagen en el Picture, pero como el archivo no es de imagen, el Picture saca el error.

Con un IF o algo asi, como podria validar que el archivo si es un archivo de Imagen para evitar este error, estuve viendo algo de If Right(File,4)<>".JPG" Then pero no me dio buenos resultados. File es la variable que tiene el String de la ruta\archivo.extension.

Quien ha trabajo con validar formato de archivos de imagene o no imagen asi?
saludos gente  :hola:
Si esto es Leído por accidente, induzca al vomito

cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: Validar Extension Del Archivo
« Respuesta #1 en: Miércoles 1 de Febrero de 2006, 22:33 »
0
También tengo un programa que guarda fotos en un directorio y en un campo de la base de datos guardo el nombre del archivo.
Lo hago en 2 pasos, al agregar un registro nuevo con un botón command tomo la foto y la coloco en el control picture, en un cuadro de texto coloco el nombre del archivo a guardar. En un segundo paso, el nombre de archivo que estaba en el cuadro de texto lo coloco en uno de los campos de la base de datos, y con otro botón command guardo el registro.
En caso de existir el error que mencionas, de archivo inválido, no coloco el nombre del archivo en el cuadro de texto.
Lo que no muestras es el código que guarda la referencia de la foto y en que momento lo haces.
Uso este código para seleccionar y abrir la imagen
Código: Text
  1. Private Sub cmdInsertFileFoto_Click()
  2.     On Error GoTo ErrorcmdInsertFile
  3.     gstrDialogTitle = &#34;¿En dónde están las Fotografías?&#34;
  4.     gstrFilename = &#34;&#34;
  5.     gstrFilter = &#34;Todos los archivos (*.*)|*.*|Imagenes (*.bmp,*.jpg,*.gif)|*.bmp;*.jpg;*.gif|Archivos Bitmap (*.bmp)|*.bmp|Archivos JPG (*.jpg)|*.jpg|Archivos GIP (*.gif)|*.gif&#34;
  6.     gintFilterIndex = 2
  7.     gintDlgAction = 1 'Abrir
  8.     Call GetWorkingDir 'Obtener directorio de trabajo, del registro
  9.     Call FileSelecter(gstrFotoWorkDir) ' Llamar commonDialog con el directorio de trabajo
  10.     gstrFotoWorkDir = gstrWorkDir
  11.     Call WriteWorkingDir 'Escribir directorio de trabajo, al registro
  12.     If Not gblnCancel Then
  13.         Picture2.Picture = LoadPicture(gstrFullFilename)
  14.         'si existe error no se ejecuta el código siguiente
  15.         Picture2.ZOrder vbBringToFront
  16.         Call Stretchpic(Picture2, picFoto)
  17.         txtFotoFilename.Text = txtNameID.Text & &#34;@&#34; & lblIDPacID & &#34;.jpg&#34;
  18.     End If
  19. Exit Sub
  20. ErrorcmdInsertFile:
  21.     gstrMsg = &#34;Existe un error al insertar la imagen desde archivo, &#34; & _
  22.     vbCrLf & &#34;Error Nº &#34; & Err.Number & &#34; = &#34; & Err.Description & &#34;.&#34;
  23.     MsgBox gstrMsg, vbCritical, gstrAppTitle
  24. Exit Sub
  25. End Sub
  26.  

El siguiente código lo uso para abrir o guardar varios tipos de archivos
Código: Text
  1. Sub FileSelecter(strWorkingDir As String)
  2.     Dim blnDirError As Boolean
  3.     On Error GoTo ErrorFileSelecter
  4.     gstrFullFilename = &#34;&#34;
  5.     gblnCancel = False
  6.     With frmHistoria
  7.         .cdlConsulta.DialogTitle = gstrDialogTitle
  8.         .cdlConsulta.Filter = gstrFilter
  9.         .cdlConsulta.FilterIndex = gintFilterIndex
  10.         .cdlConsulta.Filename = gstrFilename
  11.         .cdlConsulta.DefaultExt = gstrDefaultExt
  12.         .cdlConsulta.CancelError = True
  13.         blnDirError = True
  14.         If DirExists(strWorkingDir) Then
  15.             .cdlConsulta.InitDir = strWorkingDir
  16.         Else
  17.             .cdlConsulta.InitDir = FindDocsFolder
  18.         End If
  19.         blnDirError = False
  20.         .cdlConsulta.Action = gintDlgAction
  21.         gstrFullFilename = .cdlConsulta.Filename
  22.     End With
  23.     gstrFilename = ExtractFilename(gstrFullFilename)
  24.     gstrWorkDir = CurDir
  25.     Exit Sub
  26. ErrorFileSelecter:
  27.     If blnDirError Then
  28.         frmHistoria.cdlConsulta.InitDir = FindDocsFolder
  29.         Resume Next
  30.     ElseIf Err &#60;&#62; cdlCancel Then
  31.         GenErrorHandler &#34;modFile/FileSelecter() &#34;, Err.Number, Err.Description
  32.     Else
  33.         gblnCancel = True
  34.     End If
  35.     Exit Sub
  36. End Sub
  37.  
  38.  
Algunas de las rutinas no te las coloqué pero si las deseas las escribo, por ejemplo: FindDocsFolder, ExtractFilename
 :comp:

cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: Validar Extension Del Archivo
« Respuesta #2 en: Jueves 2 de Febrero de 2006, 07:26 »
0
Agregando a la respuesta, si deseas saber que extensión tiene un archivo usa este código:
Código: Text
  1.  
  2. Function ExtractExtension(strFilename As String)
  3.     Dim intBackslash As Integer
  4.     Dim intPoint As Integer
  5.     Dim intLenFilename As Integer
  6.     Dim intTemp As Integer
  7.     Dim strFname As String
  8.    
  9.     On Error GoTo ErrorExtractExtension
  10.     gblnExistExtension = True
  11.     strFname = Trim&#036;(strFilename)
  12.     intLenFilename = Len(strFname)
  13.    
  14.     'Find last &#092;
  15.     Do
  16.         intBackslash = intTemp
  17.         intTemp = InStr(intBackslash + 1, strFname, &#34;&#092;&#34;)
  18.     Loop Until intTemp = 0
  19.    
  20.     'Find &#34;.&#34;
  21.     Do
  22.         intPoint = intTemp
  23.         intTemp = InStr(intPoint + 1, strFname, &#34;.&#34;)
  24.     Loop Until intTemp = 0
  25.    
  26.     'Ext no exist
  27.     If intPoint &#60; intBackslash Then
  28.         intPoint = 0
  29.         gblnExistExtension = False
  30.     ElseIf intPoint = 0 And intBackslash = 0 Then
  31.         gblnExistExtension = False
  32.     End If
  33.     If gblnExistExtension = True Then
  34.         ExtractExtension = &#34;.&#34; & Right&#036;(strFname, intLenFilename - intPoint)
  35.     Else
  36.         ExtractExtension = &#34;&#34;
  37.     End If
  38.     Exit Function
  39. ErrorExtractExtension:
  40.     GenErrorHandler &#34;modFile/ExtractExtension() &#34;, Err.Number, Err.Description
  41. End Function
  42.  
  43.  
Llamas a esta función con algo parecido a esto:
strExtension = ExtractExtension(gstrFullFilename)

Y obtienes algo como esto-> ".RTF"
 :comp:

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Validar Extension Del Archivo
« Respuesta #3 en: Jueves 2 de Febrero de 2006, 16:13 »
0
Citar
(cpmario)
Lo que no muestras es el código que guarda la referencia de la foto y en que momento lo haces.

Si cierto verdad, aqui esta es este:

Código: Text
  1.  
  2. On Error GoTo errorhandler
  3.  
  4.     'Validando que no existan campos nulos:
  5.     'Evitando asociar la Foto a unos TextBox vacios
  6.     If FrmPrincipal.TxtBuscar.Text = &#34;&#34; And _
  7.        FrmPrincipal.TxtNombre.Text = &#34;&#34; Then
  8.             Unload Me
  9.             MsgBox(&#34;Debe indicar los datos del registro para procesar&#34;)
  10.             Exit Sub
  11.     End If
  12.  
  13.     'Referenciado a:
  14.     'Microsoft Scripting Runtime:
  15.     Dim CopyFile As Scripting.FileSystemObject
  16.    
  17.     Set CopyFile = New Scripting.FileSystemObject
  18.    
  19.     'Verificando nuevamente si el archivo de la Foto existe o no
  20.     If Existe = vbNullString Then 'No Existe el Archivo de la Foto
  21.         Unload Me
  22.         Exit Sub
  23.         'No se muestra ningun aviso pq ese ya sale con el Load
  24.         'Esta ventana ya carga en su Load la Foto buscada con el CommonDialog
  25.         'que se encuentra en la ventana Principal.
  26.     End If
  27.    
  28.     'Si existe el archivo de la Foto, proceguimos...
  29.     'Primero revisamos que la foto será asociada a un
  30.     'registro existente en la BD: (buscamos el registro)
  31.     If Rs.RecordCount &#62; 0 Then
  32.         Rs.MoveFirst
  33.         While Not Rs.EOF
  34.             If UCase(FrmPrincipal.TxtBuscar.Text) = Rs(&#34;TxtBuscar&#34;) Then
  35.                 'Si existe el registro en la Bd:
  36.                 'Verificando existencia de la foto y guardandola:
  37.                 '(nueva foto o cambiando anterior por una nueva)
  38.                 If CopyFile.FileExists(File) Then
  39.                     CopyFile.CopyFile File, App.Path & &#34;&#092;Imagenes&#092;Fotos&#092;&#34; & FrmPrincipal.TxtBuscar.Text & &#34;.JPG&#34;, True
  40.                     Unload Me
  41.                     BUSCANDO_FOTO
  42.                     'Aviso de Foto Guardada:
  43.                     MsgBox(&#34;La Foto ha sido Guardada y asocidada al Contacto&#34;)
  44.                     Exit Sub
  45.                 End If
  46.             End If
  47.             Rs.MoveNext
  48.         Wend
  49.         Unload Me
  50.         'No se encontro el registro en la Bd:
  51.         'Se guarda el nuevo registro:
  52.         Rs.AddNew
  53.         Rs(&#34;TxtBuscar&#34;) = UCase(FrmPrincipal.TxtBuscar.Text) 'Nombre Clave
  54.         Rs(&#34;TxtNombre&#34;) = FrmPrincipal.TxtNombre.Text
  55.         Rs(&#34;TxtTelefCel&#34;) = FrmPrincipal.TxtTelefCel.Text
  56.         Rs(&#34;TxtTelefHab&#34;) = FrmPrincipal.TxtTelefHab.Text
  57.         Rs(&#34;TxtTelefTrab&#34;) = FrmPrincipal.TxtTelefTrab.Text
  58.         Rs(&#34;TxtFax&#34;) = FrmPrincipal.TxtFax.Text
  59.         Rs(&#34;TxtEmail&#34;) = FrmPrincipal.TxtEmail.Text
  60.         Rs(&#34;TxtCumple&#34;) = FrmPrincipal.TxtCumple.Text
  61.         Rs(&#34;TxtDireccion&#34;) = FrmPrincipal.TxtDireccion.Text
  62.         Rs(&#34;TxtObservaciones&#34;) = FrmPrincipal.TxtObservaciones.Text
  63.         Rs.Update
  64.         '.......................
  65.         'Guardando la Foto:
  66.         If CopyFile.FileExists(File) Then
  67.             CopyFile.CopyFile File, App.Path & &#34;&#092;Imagenes&#092;Fotos&#092;&#34; & FrmPrincipaol.TxtBuscar.Text & &#34;.JPG&#34;, True
  68.             Unload Me
  69.             BUSCANDO_FOTO 'para mostrar de una vez.
  70.         End If
  71.     End If
  72.     MsgBox(&#34;Registro Guardado&#34;)
  73.    
  74. 'Formato de archivo de imagen incorrecto (.txt, doc, etc...)
  75. errorhandler:
  76.     If Err.Number Then 'Error: 481
  77.         MsgBox(&#34;No Existe el Archivo de Imagen&#34;)
  78.         Exit Sub
  79.     End If
  80.  
  81.  

Esto busca la Foto en la carpeta "Fotos" y la muestra con su registro de una vez.
en caso de que el registro tenga foto, sino tiene, entonces muestra una imagen (un logo -> Foto.jpg) que esta guardado en la carpeta "Fotos" para los registros que no tengan Foto.
Código: Text
  1.  
  2. 'BUSCANDO LA FOTO DEL CONTACTO EN LA CARPETA &#34;FOTOS&#34; DENTRO DE LA CARPETA DEL PROGRAMA:
  3. Private Sub BUSCANDO_FOTO()
  4.     Dim strNombre As String
  5.     strNombre = FrmPrincipal.TxtBuscar.Text
  6.    
  7.     'En caso de que las Carpetas Imagenes y Fotos hayan sido borradas
  8.     'se crean nuevamente:
  9.     ExisteCarpeta App.Path & &#34;&#092;Imagenes&#34;
  10.     ExisteCarpeta App.Path & &#34;&#092;Imagenes&#092;Fotos&#34;
  11.    
  12.     On Error GoTo errorhandler
  13.    
  14.    
  15.     'Foto encontrada (si existe en la carpeta Fotos):
  16.     If Dir(App.Path & &#34;&#092;Imagenes&#092;Fotos&#092;&#34; & strNombre & &#34;.JPG&#34;) &#60;&#62; &#34;&#34; Then
  17.         FrmPrincipal.PictFoto.Picture = LoadPicture(App.Path & &#34;&#092;Imagenes&#092;JPG&#092;Fondo_Foto.JPG&#34;)
  18.         FrmPrincipal.PictureX.Picture = LoadPicture(App.Path & &#34;&#092;Imagenes&#092;Fotos&#092;&#34; & strNombre & &#34;.JPG&#34;)
  19.         Call Stretchpic2(FrmTelefonos.PictureX, FrmPrincipal.PictFoto)
  20.         Exit Sub
  21.     Else 'El Archivo No Existe (No Encontrado)
  22.         FrmPrincipal.PictFoto.Picture = LoadPicture(App.Path + &#34;&#092;Imagenes&#092;Fotos&#092;Foto.JPG&#34;)
  23.     End If
  24.    
  25. 'Formato de archivo de imagen incorrecto (.txt, doc, etc...)
  26. errorhandler:
  27.     If Err.Number Then 'Error: 481
  28.         'Aviso No Existe el Archivo de la Foto:
  29.         Msgbox(&#34;La Foto seleccionada para el registro no existe, verifique&#34;)
  30.     End If
  31. End Sub
  32.  
  33.  

 :huh: Algo que se me paso comentar es que el problema puede ser algo más problematico  de lo que pensé, porque cuando guardo el archivo en la carpeta "Fotos" el programa le pone extension .JPG eso quiere decir que si selecciono un archivo TXT el programa le cambiara el .TXT por un .JPG y entonces un codigo que valide la extensión del archivo para saber si es un archivo de imagen o no, es algo que no me sirve porque ese codigo de validacion de extension siempre encontrara la extension .JPG y no la .TXT ta fea la cosa verdad  :blink:

Voy a ver tu codigo para ver si anexo algo que resuelva eso, bueno yo no tengo que hacer nada de eso que haces en tu programa, eso de buscar la foto y poner el nombre en un TextBox, el programa hace todo esto más Automaticamente él solo, el usuario solo busca la foto y el programa se encarga de verificar que exista, lo guarda de una vez en la carpeta Fotos y el propio programa le cambia el nombre alarchivo por el CampoID del registro.

Es decir, si consulto al usuario o cliente "Pepe" el programa el cambia el nombre a la foto y le pone "Pepe" y al consultar el registro busca el archivo "Pepe" en la carpeta "Fotos" el lo que respecta a la foto el usuario solo usa el mouse para buscar la foto y darle guardar, para que el programa lo asocie con el registro.

Me parece muy buena idea lo del Textbox en donde se escribe el nombre del archivo de imagen, lo que pasa es que los usuarios que no saben nada de PCs les gusta todo mas facil y sencillo, darle un click aqui y allá, y listo, entonces uno trata de facilitarle las cosas, aunque seria muy vaga la persona que le pese darle a un boton para buscar la imagen (a juro tiene que hacerlo) y luego escribir el nombre del archivo en otra parte y luego guardar, eso no cuesta nada hacerlo, aunque lo mio ya esta todo hecho asi como decia, pero vere si le hago sus ajustes de buscar y guardar la imagen dependiendo de lo problematico que torne esto del formato de imagen.
Si esto es Leído por accidente, induzca al vomito

cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: Validar Extension Del Archivo
« Respuesta #4 en: Jueves 2 de Febrero de 2006, 20:05 »
0
El problema que tienes es que basas parte de la programación en verificar que el archivo existe o no. Si el usuario lo toma con el commomdialog es obvio que existe y no es necesario verificar que existe, valga la redundancia. Además de verificar que el archivo exista debes verificar que sea un archivo válido, cargándolo en un cuadro picture.

Si el usuario escoge un archivo que no existe o que no sea válido, se generará un error que debes aprovechar para evitar guardar el archivo erroneo. Este manejo de error es anterior a guardar el archivo de la foto y el registro de la base de datos.

En mi programa si el archivo existe o no tiene error coloco el nombre del archivo en el cuadro de texto (con propiedad visible= false que no ve el usuario y que está enlazado a un datacontrol listo para grabarse en la base de datos) .
Y si hay error dejo al cuadro de texto vació y no se graba nada en la base de datos.


-------------
Hay problemas en el foro para que se muestren los emoticones :-)

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Validar Extension Del Archivo
« Respuesta #5 en: Jueves 2 de Febrero de 2006, 22:13 »
0
Listo, bueno el codigo de captura de error lo repuse y recontrarepuse en el codigo que busca y guarda la foto como el que la visualiza en consultas, a la final ya el picture no produce error que era lo que queria, que no saliese un error raro de windows o aviso de error del lenguaje en ejecucion y se cerrara la aplicacion.

Lo malo es que aun se ve una ventana que le pregunta al usuario si desea guardar la imagen a pesar de que el picture no la toma pq no es valida, pero al darle al boton de "si" pues no sucede nada, el programa aborta el codigo pq sabe que el archivo no es valido, o mejor dicho, sabe que se producira un error.

Citar
(cpmario)
Si el usuario lo toma con el commomdialog es obvio que existe y no es necesario verificar que existe, valga la redundancia.

Si eso es cierto, obviamente si se busca con una ventanita de CommonDialog el archivo, se encuentra uno y se selecciona, lo que pasa es que uno siempre tiene que validar todo, incluso hacer programas "Anti Tercos" porque puede pasar casos de los mas raros.  No sea que alguien tenga un formato de imagen raro pero que a la final si es un archivo de imagen y se le ocurra escogerlo, debe capturarse el error si.

Bueno yo probe buscar un archivo por medio de la ventanita del CommonDialog pero en vez de selecionar un archivo, quise escribir garabatos: sdfsafdf

Y eso producia error porque la variable "File" guardaba lo del CommonDialog y bueno... si a algun loco usuario se le ocurre decir "vamos a escribirle garatos a ver si da error" o que tal si alguien seleciona un archivo pero descuidadamente sin quere presiona una tecla con el codo, es decir por accidente le agregas una letras demas al nombre del archivo, ya desde el punto de vista del ordenador (por asi decirlo) ese archivo no existe y debe validarse eso para que no de error.  Por eso a pesar de hacerle la busqueda con el CommonDialog el programa evita archivos que no existan o que no sean de formato de imagen valido para el picture.

Pero ya todo listo  :lightsabre:

Gracias por la ayudita compa, con tu permiso pongo tu codigo en un documentico de Word en donde recopilo algunas que otras cosillas, quien quita que me haga la urgencia y ya tenga a la mano un example.

Thanks  :hola:
Si esto es Leído por accidente, induzca al vomito