Como guardar archivos en Oracle desde php
|Si en algun momento se les presenta el reto de guardar archivos dentro de la base de datos Oracle como binarios, a continuación les voy a presentar una forma de hacerlo.
No voy a iniciar discusión si es o no recomendable hacerlo, en ciertas situaciones ciertamente conviene, otras no, pero si el jefe asi lo quiere que más se puede hacer.
Primero les dejo el script de la tabla que vamos a utilizar.
1 2 3 4 5 6 7 |
CREATE TABLE ARCHIVOS ( ID NUMBER, ARCHIVO BLOB, NOMBRE VARCHAR2(150 BYTE), TIPO VARCHAR2(150 BYTE) ) |
Y a continuación dejo el código php que solo esta de copiar y pegar para probarlo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
<?php //verifica si se ha hecho clic en el boton guardar if(filter_input(INPUT_POST, 'btnGuardar')){ $id= filter_input(INPUT_POST, 'id'); /*propiedades del archivo*/ $archivo_nombre=$_FILES['archivo']['name']; $archivo_tipo = $_FILES['archivo']['type']; $archivo_temp = $_FILES['archivo']['tmp_name']; //conexion con oracle $conn= oci_connect('usuario', 'contrasena', '127.0.0.1/ORCL', 'AL32UTF8'); //verificamos si no hay error en la conexion if(!$conn){ $error= oci_error(); die("ERROR: ".$error["message"]); } //lee el archivo a un string $archivo_string= file_get_contents($archivo_temp); /* preparamos la sentencia sql * como observan he declarado unos paramentros en la sentencia sql * que recibiran valores desde el oci_bind_by_name más abajo. */ $st= oci_parse($conn, 'INSERT INTO ARCHIVOS (ID, ARCHIVO, NOMBRE, TIPO) VALUES (:ID, empty_blob(), :NOMBRE, :TIPO) RETURNING ARCHIVO INTO :ARCHIVO'); //inicializamos una variable de tipo blob $blob=oci_new_descriptor($conn, OCI_D_LOB); //vinculamos los parametros con las variables oci_bind_by_name($st, ":ID", $id); oci_bind_by_name($st, ":NOMBRE", $archivo_nombre); oci_bind_by_name($st, ":TIPO", $archivo_tipo); oci_bind_by_name($st, ":ARCHIVO", $blob, -1, OCI_B_BLOB); //ejecutamos el statement sin hacer commit oci_execute($st, OCI_NO_AUTO_COMMIT); $blob->save($archivo_string); //guardamos el archivo como binario oci_commit($conn); //ejecutamos el commit //liberamos la variable y cerramos conexion $blob->free(); oci_free_statement($st); oci_close($conn); echo 'termino'; } ?> <!--FORMULARIO--> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form method="post" action="" enctype="multipart/form-data"> id <input type="number" name="id" /><br/> <input type="file" name="archivo" /><br/><br/> <input type="submit" name="btnGuardar" value="Guardar" /> </form> </body> </html> |
Para ver el archivo creamos ver.php donde le pasamos el id del registro que queremos ver:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php //obtener el id de la imagen $id= filter_input(INPUT_GET, 'id'); if($id==''){ die ("No tenemos el id"); } //conexion con oracle $conn= oci_connect('usuario', 'contrasena', '127.0.0.1/ORCL', 'AL32UTF8'); $sql="SELECT ARCHIVO, TIPO FROM ARCHIVOS WHERE ID = $id"; $stmt = oci_parse($conn, $sql); oci_execute($stmt); $archivo= oci_fetch_array($stmt, OCI_ASSOC + OCI_NUM + OCI_RETURN_NULLS); $blob=$archivo[0]->load(); $tipo=$archivo[1]; oci_free_statement($stmt); oci_close($conn); //header para tranformar la salida en el tipo de archivo que hemos guardado header("Content-type: $tipo"); echo $blob; |
Espero que les sea de ayuda, saludos.
3 comentarios
Excelente código, funciona muy bien, muchas gracias
excelente codigo, podrias ayudarme a poder listar los archivos guardados.. gracias
Para ver la lista de lo guardado sería de hacer un select consultando id y nombre por ejemplo, y luego imprimir en pantalla ese resultado.