Quiero guardar una imagen en un campo blob de mysql y no puedo, utilizo vfp, muy similar al visual basic que tu conoces, el problema es que no se si el load_file solo funciona en el servidor, lo que pasa es que yo tengo terminales remotas conectadas a mi mysql por odbc, entonces leo el archivo por fread() linea por linea, lo junto y lo envío por paso sql, pero me da un error de sintaxis, ya reemplace los códigos raros por sus respectivos códigos de escape y aun así no puede interpretar los datos binarios, ¿tienes una idea mejor?
1 Respuesta
Respuesta de jahg_23
1
1
jahg_23, WebMaster, diseñador y programador vb ,javascript, perl, php,...
En realidad el único interrogante es si necesitás guardar las imágenes capturadas dentro de la db o en alguna carpeta externa (guardando la ruta en la db), en donde la seguridad la maneja el SO. Si la primera opción es la elegida necesitás un campo binario (BLOB) para almacenar las imágenes, y podes guardarlas y recuperarlas usando los métodos GetChunk y AppendChunk de un objeto Field de ADO.
Enviando datos al campo BLOB Empecemos cargando una imagen en la base de datos. Además de nuestro objeto de conexión, necesitaremos un objeto RECORDSET y un objeto STREAM. Declaremos estos dos objetos. Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset Dim mystream As ADODB.Stream Set mystream = New ADODB.Stream mystream.Type = adTypeBinary Un objeto ADO Stream puede manejar texto y datos binarios (y puede ser utilizado para recuperar textos largos almacenados en los campos BLOB). Tenemos que especificar que tipo de dato vamos a utilizar usando el valor adTypeBinary en el parámetro Type. Lo primero que se requiere hacer es agregar un registro en blanco en el recordset rs.Open "SELECT * FROM files WHERE 1=0", conn, adOpenStatic, adLockOptimistic rs.AddNew Ahora tenemos un recordset vacío (gracias a la cláusula WHERE) para trabajar con el, al cual le vamos a agregar un nuevo registro. Vamos a cargar el archivo usando el objeto STREAM. mystream.Open mystream.LoadFromFile "c:myimage.gif" Una vez cargado el archivo procedemos a complementar los datos del recordset y actualizarlo rs!file_name = "myimage.gif" rs!file_size = mystream.size rs!file = mystream.read rs.Update Mystream. Close Rs. Close Conn. Close Es importante aclarar que los datos se almacenaran solamente en el proceso de actualización. El objeto STREAM no adiciona datos ni efectúa transferencia de información al servidor. Recuperando datos Bien, ahora que tenemos la imagen en nuestra tabla, estamos listos para recuperarla. Como lo hemos hecho anteriormente, inicializamos la conexión y el recordset Dim conn As New ADODB.Connection conn.ConnectionString = GloConnectionString conn.CursorLocation = adUseClient conn.Open Dim rs As New ADODB.Recordset Dim mystream As New ADODB.Stream mystream.Type = adTypeBinary rs.Open "Select * from files WHERE files.file_id = 1", conn Hemos abierto la conexión y el recordset, y se ha declarado el objeto STREAM. Para traer nuestro archivo abrimos el objeto STREAM, escribimos a el desde el recordset y entonces lo guardamos como archivo mystream. Open mystream.Write rs! File mystream. SaveToFile "c: ewimage.gif", adSaveCreateOverWrite Mystream. Close Rs. Close Conn. Close Hemos cargado los datos binarios del recordset usando la sintaxis mystream. Write rs! File, donde rs! ¿File es el campo del recordset que contiene los datos binarios que queremos? ¿Escribir? En el objeto STREAM. El método SAVETOFILE toma dos argumentos: el nombre de archivo y ubicación donde queremos se ubique el mismo (localización del objetivo), y una variable que determina el tipo de acción del objeto STREAM cuando el archivo existe. Con la opción adSaveCreateOverWrite, los archivos existentes siempre serán reemplazados. Cuando se especifica la opción adSaveCreatenoexists los archivos no serán borrados si existen. Actualizando datos Se puede actualizar el contenido del campo de la misma forma como se agrego el dato, con la única diferencia de especificar cual es el registro que se desea actualizar, utilizando la cláusula WHERE. rs.Open "Select * from files WHERE files.file_id = 1", conn, adOpenKeyset, adLockOptimistic mystream.Open mystream.LoadFromFile "c:updateimage.gif" rs!file = mystream.Read rs.Update Mystream. Close Rs. Close ¡ Y eso es todo !