Foros del Web » Programando para Internet » PHP »

Campos BLOB (no lo almacena)

Estas en el tema de Campos BLOB (no lo almacena) en el foro de PHP en Foros del Web. Hola, estoy intentando almacenar pdfs en una BBDD. Ya sé que la mejor opción es almacenar en un campo la ruta del fichero y que ...
  #1 (permalink)  
Antiguo 25/03/2008, 10:14
 
Fecha de Ingreso: febrero-2005
Mensajes: 105
Antigüedad: 19 años, 2 meses
Puntos: 1
Campos BLOB (no lo almacena)

Hola, estoy intentando almacenar pdfs en una BBDD. Ya sé que la mejor opción es almacenar en un campo la ruta del fichero y que cuando éste sea requerido se cargue el fichero desde la ruta almacenada, pero prefiero hacerlo así porque me es más fácil hacer una copia de seguridad de la BBDD entera. Bueno, mi problema es que no logro almacenar el fichero pdf en la BBDD. Mi código es el siguiente:

Formulario XHTML:

Código:
<form class = "Formulario" enctype="multipart/form-data" action = "crearNuevaPublicacion.php" method = "POST">
    <table>
	<tr><td>DOI (Identificador de Objeto &Uacute;nico): </td><td><input name = "DOI" type = "text" /></td></tr>
	<tr><td>T&iacute;tulo: </td><td><input name = "titulo" type = "text" /></td></tr>
	<tr><td>Autor (es): </td><td><input name = "autores" type = "text" /></td></tr>
	<tr><td>(*) Resumen: </td><td><input name = "resumen" type = "text" /></td></tr>
	<tr><td>Palabras Clave: </td><td><input name = "palabras_clave" type = "text" /></td></tr>
	<tr><td>(**) CDU (Clasificaci&oacute;n Decimal Universal): </td><td><input name = "CDU" type = "text" /></td></tr>
	<tr><td>Idioma: </td><td><input name = "idioma" type = "text" /></td></tr>
	<tr><td>ISSN: </td><td><input name = "ISSN" type = "text" /></td></tr>
	<tr><td>Fichero: </td><td><input name = "fichero" type = "file" /></td></tr>
	<tr><td><input type = "radio" name = "eleccion" value = "1" /> Publicar</td></tr>
	<tr><td><input type = "radio" name = "eleccion" value = "0" /> Guardar como borrador</td></tr>
	<tr><td><input type = "submit" value = "A&ntilde;adir a BAE" /></td></tr>
	<tr><td colspan = "2"><hr /></td></tr>
	<tr><td colspan = "2">(*) Campos no obligatorios.</td</tr>
    </table>
</form>
crearNuevaPublicacion.php

Código:
......
// Recogemos los datos del formulario.
    $doi = $_POST['DOI'];
    $titulo = $_POST['titulo'];
    $autores = $_POST['autores'];
    $resumen = $_POST['resumen'];
    $palabras_clave = $_POST['palabras_clave'];
    $cdu = $_POST['CDU'];
    $idioma = $_POST['idioma'];
    $issn = $_POST['ISSN'];

    // Preparamos los datos del fichero.
    $tamanyo = (($_FILES['fichero']['size']/1048576));
    // $fichero = addslashes(file_get_contents($_FILES['fichero']['tmp_name']));
    $fichero = addslashes(file_get_contents($_FILES['fichero']['tmp_name']));
    $fecha_insercion = date("Y-m-d", time());
    $contenido_valido = $_POST['eleccion'];
    $idNombre = $_SESSION['nombreUsuario'];
    $idClave = $_SESSION['claveUsuario'];
    .....

    // Insertamos la nueva publicación en la Base de Datos (eleccion = 1 -> pública: eleccion = 0 -> borrador).
    insertarPublicacion ($doi, $titulo, $autores, $resumen, $palabras_clave, $cdu, $idioma, $tamanyo, $contenido_valido, $fecha_insercion, $issn, $fichero, $idNombre, $idClave, $eleccion);
    .....
insertarPublicacion():

Código:
    ......
    $conexion = conectar ();

    $resultado = mysql_query ("INSERT INTO publicaciones (DOI, titulo, autores, resumen, palabras_clave, CDU, idioma, tamanyo, contenido_valido, fecha_insercion, ISSN, fichero, nombre_usuario, clave_usuario) VALUES ('" . $doi . "','" . $titulo . "','" . $autores . "','" . $resumen . "','" . $palabras_clave . "','" . $cdu . "','" . $idioma . "','" . $tamanyo . "','" . $contenido_valido . "','" . $fecha_insercion . "','" . $issn . "','" . $fichero . "','" . $idNombre . "','" . $idClave . "');");

    cerrar ($conexion);
        .....
El tema es que todo lo hace bien excepto almacenar el pdf en la BBDD. El tipo del campo el "longblob" y el fihcero que intento cargar ocupa 1,10 MB, es decir, no excede el tamaño permitido en el fihcero de configuración de mySQL. He mostrado las variables por pantalla y las muestra correctamente. Es decir, DOI = 00.0000/0000, titulo = Título del pdf,...., fichero = %PDF - .........056%%EOF,...). Así que, supongo que algo se me está escapando....¿Alguien podría decirme el qué? He estado mirando tutoriales y no encuientro el error, incluso utilizando phpMyAdmin he introducido los datos a mano y copiado la consulta sustituyendo las variables, pero nada. Me sería de gran ayuda que alguien me hechase una manita. Muchas gracias!!
  #2 (permalink)  
Antiguo 25/03/2008, 10:20
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Campos BLOB (no lo almacena)

¿Que error es el que te muestra?

Saludos.
  #3 (permalink)  
Antiguo 25/03/2008, 10:27
 
Fecha de Ingreso: febrero-2005
Mensajes: 105
Antigüedad: 19 años, 2 meses
Puntos: 1
Re: Campos BLOB (no lo almacena)

Hola GatorV, pues la verdad es que no me muestra ningún error en el navegador. Simplemente no almacena nada en la base de datos. He probado a dejar

Código:
$fichero = addslashes(file_get_contents($_FILES['fichero']['tmp_name']));
De la siguiente forma:

Código:
$fichero = $_FILES['fichero']['tmp_name'];
Y me almacena lo siguiente:

C:ARCHIV~1EASYPH~1\tmpphpF1.tmp

Así que supongo que php crea el fichero temporal para almacenarlo, y de hecho lo almacena. Pero cuando en vez de la ruta del fichero temporal le digo que me almacene el contenido binario no lo hace. Es algo extraño, verdad??

Aunque realmente, a mano también me da un error:

Fatal error: Maximum execution time of 30 seconds exceeded in c:\archivos de programa\easyphp1-8\phpmyadmin\libraries\string.lib.php on line 91

Debido a que tarda mucho tiempo en cargar los datos en la BBDD. Pero sólo con el fichero de 1,10 MB, porque con otro de 490 KB funciona perfecto. Tal vez tenga algo que ver??

Un saludo!!!

P.D: Si hubiese un tutorial claro y sencillo donde hacerlo de la otra forma podría alguien indicarme la url?

Última edición por gazpachoymochil; 25/03/2008 a las 10:42
  #4 (permalink)  
Antiguo 25/03/2008, 10:41
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Campos BLOB (no lo almacena)

Mmm prueba hacer esto:
Código PHP:
    // Preparamos los datos del fichero.
    
$tamanyo = (($_FILES['fichero']['size']/1048576));
    
// $fichero = addslashes(file_get_contents($_FILES['fichero']['tmp_name']));
    
if( !is_uploaded_file$_FILES['fichero']['tmp_name'] ) ) {
         die( 
"No se envio un fichero valido!" );
    }
    
$fichero addslashes(file_get_contents($_FILES['fichero']['tmp_name']));
    if( empty( 
$fichero ) ) {
           die( 
"El fichero esta vacio!" );
    }
    
$fecha_insercion date("Y-m-d"time());
    
$contenido_valido $_POST['eleccion'];
    
$idNombre $_SESSION['nombreUsuario'];
    
$idClave $_SESSION['claveUsuario']; 
Saludos.
  #5 (permalink)  
Antiguo 25/03/2008, 10:58
 
Fecha de Ingreso: febrero-2005
Mensajes: 105
Antigüedad: 19 años, 2 meses
Puntos: 1
Re: Campos BLOB (no lo almacena)

Hola nuevamente GatorV, lo he probado y sucede lo mismo. Es extraño porque me he dado cuenta de que un fichero llamado fich.txt de 4,00 KB lo almacena perfectamente, pero el otro fichero llamado fich2.pdf de 1,10 MB no lo almacena. La verdad es que no sé por donde continuar...

Si no fuese posible me gustaría saber donde puedo encontrar ideas para hacerlo almacenando la ruta sólo (es decir, debería crear carpetas de forma dinámica o comprobar si ya existen, almacenar el fichero en éstas, etc...), aunque preferiría saber cómo hacerlo almacenándolo en la BBDD.

Un saludo y gracias por el interés que estás mostrando!!
  #6 (permalink)  
Antiguo 25/03/2008, 11:01
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Campos BLOB (no lo almacena)

Si archivos pequeños te los esta guardando debe de ser el limite de memoria de PHP, prueba aumentarlo, también aumentar el tamaño del post_max_uploadsize y upload_max_size.

Saludos.
  #7 (permalink)  
Antiguo 25/03/2008, 11:44
 
Fecha de Ingreso: febrero-2005
Mensajes: 105
Antigüedad: 19 años, 2 meses
Puntos: 1
Re: Campos BLOB (no lo almacena)

Vale, estoy llegando a la misma conclusión, porque me sube ficheros pequeños, pero el de 1,10 MB no lo sube a la BBDD. Me sube ficheros de cualquier tipo (.txt, .pdf,...) de hasta 1 MB, más o menos. Si subo un fihcero que "pese" más no funciona.
Bueno, en mi fichero de configuración (php.ini) tengo lo siguiente:

;;;;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;;;;

; Whether to allow HTTP file uploads.
file_uploads = On

; Temporary directory for HTTP uploaded files (will use system default if not specified).
upload_tmp_dir = "${path}\tmp\"

; Maximum allowed size for uploaded files.
upload_max_filesize = 2M

Si éste último valor lo cambio a 10M sigo teniendo el mismo problema. Estoy usando EasyPHP, ¿tal vez sea algún parámetro de configuración predefinido?¿Cómo puede ser que esta tontería me esté dando tantos quebraderos de cabeza!?!?!

Última edición por gazpachoymochil; 25/03/2008 a las 12:00
  #8 (permalink)  
Antiguo 25/03/2008, 13:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Campos BLOB (no lo almacena)

También tienes una directiva llamada post_max_size, tienes que aumentar en conjunto con upload_max_filesize.

Saludos.
  #9 (permalink)  
Antiguo 26/03/2008, 11:02
 
Fecha de Ingreso: febrero-2005
Mensajes: 105
Antigüedad: 19 años, 2 meses
Puntos: 1
Re: Campos BLOB (no lo almacena)

Hola GatorV, es verdad que tengo una línea que indica:

; Maximum size of POST data that PHP will accept.
post_max_size = 8M

Pero según todos los datos anteriores y éste, la base de datos debería ser capaz de almacenar fihceros de 1,10 MB y no lo hace. ¿Qué parámetro debo modificar para que lo haga?

Saludos!!
  #10 (permalink)  
Antiguo 26/03/2008, 12:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Campos BLOB (no lo almacena)

Hay una directiva de MySQL, que debes de cambiar y es el tamaño del paquete para insertar en el blob y es max_allowed_packet, en el my.cnf, también checa el HTTP POST SIZE en el httpd.conf de Apache, o si usas IIS checa el tamaño máximo del paquete HTTP POST.

Saludos.
  #11 (permalink)  
Antiguo 26/03/2008, 12:52
 
Fecha de Ingreso: febrero-2005
Mensajes: 105
Antigüedad: 19 años, 2 meses
Puntos: 1
Re: Campos BLOB (no lo almacena)

En el fichero de configuración httpd.conf de apache busco la cadena "POST" y sólo encuentro:

#<Directory "${path}/apache/users">
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# <Limit GET POST OPTIONS PROPFIND>
# Order allow,deny
# Allow from all
# </Limit>
# <LimitExcept GET POST OPTIONS PROPFIND>
# Order deny,allow
# Deny from all
# </LimitExcept>
#</Directory>

pero nada de HTTP POST ni HTTP POST SIZE. Y el fihcero de configuración de mySQL:

; IMPORTANT
; ${path} is used to specify EasyPHP installation path

[mysqld]
datadir=${path}/mysql/data
basedir=${path}/mysql
bind-address=127.0.0.1
; Uncomment for use on USB key
; skip-innodb

Busco en las carpetas de mysql y nada, dentro de los ficheros no encuentro nada. También he buscado en el fichero php.ini y he encontrado lo siguiente:

[MSSQL]
; Allow or prevent persistent links.
mssql.allow_persistent = On

; Maximum number of persistent links. -1 means no limit.
mssql.max_persistent = -1

; Maximum number of links (persistent+non persistent). -1 means no limit.
mssql.max_links = -1

; Minimum error severity to display.
mssql.min_error_severity = 10

; Minimum message severity to display.
mssql.min_message_severity = 10

; Compatability mode with old versions of PHP 3.0.
mssql.compatability_mode = Off

; Connect timeout
;mssql.connect_timeout = 5

; Query timeout
;mssql.timeout = 60

; Valid range 0 - 2147483647. Default = 4096.
;mssql.textlimit = 4096

; Valid range 0 - 2147483647. Default = 4096.
;mssql.textsize = 4096

; Limits the number of records in each batch. 0 = all records in one batch.
;mssql.batchsize = 0

; Specify how datetime and datetim4 columns are returned
; On => Returns data converted to SQL server settings
; Off => Returns values as YYYY-MM-DD hh:mm:ss
;mssql.datetimeconvert = On

; Use NT authentication when connecting to the server
mssql.secure_connection = Off

; Specify max number of processes. Default = 25
;mssql.max_procs = 25

pero estoy ya muy mareado. No sé por donde mirar!!! Estoy ya al borde de la desesperación, creeme. ¿Alguna sugerencia? A ver si va a ser que EasyPHP... empiezo a dudar de todo.
  #12 (permalink)  
Antiguo 26/03/2008, 16:02
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Campos BLOB (no lo almacena)

En el my.cnf agrega la directiva si no esta, y ponle un valor de 16 MB o 32 MB..

Saludos.
  #13 (permalink)  
Antiguo 28/03/2008, 09:04
 
Fecha de Ingreso: febrero-2005
Mensajes: 105
Antigüedad: 19 años, 2 meses
Puntos: 1
Re: Campos BLOB (no lo almacena)

Gracias GATORV, parece que ahora ya carga ficheros de tamaño mayor!!!! He añadido la directiva

max_allowed_packet=16M

al fichero my.ini (dentro de la carpeta "conf_files" de EasyPHP) y da la impresión de que ya deja cargar ficheros de, al menos, 1,06 MB (es el que he probado).

Espero no tener ningún tipo de problema más. Gracias!!!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 21:56.