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.