Foros del Web » Programando para Internet » PHP »

subir archivos grandes a Mysql en Linux

Estas en el tema de subir archivos grandes a Mysql en Linux en el foro de PHP en Foros del Web. Que tal, les cuento el problema que tengo y no se como resolverlo, he leido las preguntas relacionadas en este foro y buscado en la ...
  #1 (permalink)  
Antiguo 03/05/2005, 21:42
 
Fecha de Ingreso: octubre-2004
Mensajes: 82
Antigüedad: 19 años, 6 meses
Puntos: 1
subir archivos grandes a Mysql en Linux

Que tal, les cuento el problema que tengo y no se como resolverlo, he leido las preguntas relacionadas en este foro y buscado en la red y nada.

Necesito subir archivos a MySql entre 2M a 10M, programando las aplicaciones en PHP y utilizando Apache como servidor, montado en Fedora Core; he configurado lo siguiente en PHP:

file_uploads = On
max_execution_time = 120
max_input_time = 120
memory_limit = 16M

upload_tmp_dir = /xyz

post_max_size = 10M
upload_max_filesize = 10M

De estas configuraciones todo me queda claro y estan bien echas, de echo en la aplicacion hago restricciones acerca del tipo de archivo y de su mismo tamaño (que no exceda los 10MB) y jala todo bien pero en Windows.

El problema lo tengo en Linux (Fedora Core), por que no me sube archivos mayores a 1.x MB a MySql, les cuento que no instale los paquetes que te proporciona el sistema por default, me base en un tutorial del cual pongo el link:

http://www.adictosaltrabajo.com/tuto...=php_on_debian

Por el foro cheque que un cuate decia que para subir archivos grandes a Mysql en Linux habia que hacer esta configuracion extra en el archivo de configuracion ***php.conf*** del Apache

<Files *.php>
SetOutputFilter PHP
SetInputFilter PHP
LimitRequestBody 33554432 <---------------------------- si fueran 32M
</Files>


solo que yo no tengo ese archivo, me imagino a que como no instale los paquetes por defualt del sistema sino que lo hice por separado, total de que no se como solucionar el problema a ver si alguien sabe como hacerlo, ya sea que haya que volver a compilar o configurar en alguna otra parte, les pongo la ruta en donde se instalan los paquetes:

APACHE: /usr/local/apache2/
PHP: /usr/local/php4/
  #2 (permalink)  
Antiguo 03/05/2005, 22:05
Avatar de sism82  
Fecha de Ingreso: octubre-2003
Ubicación: Guadalajara
Mensajes: 865
Antigüedad: 20 años, 6 meses
Puntos: 1
apache no tiene tal archivo hasta donde sé.
has explicado muy bien lo que deseas, pero no cuales son los resultados que has obtenido, si el script se cuelga, si te aparece algún error. Asegurate de tener error_reporting=E_ALL en php.ini

saludos
  #3 (permalink)  
Antiguo 04/05/2005, 09:57
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
El famoso "php.conf" sólo lo tiene Apache (parece que para 2.x versión) para Linux .. (o se usa bajo Apache para Linux)

http://www.activsoftware.com/apache/apache2php.cfm

Ahí dice que hay que crear dicho archivo ... Pero viendo la estructura .. creo que colocando dicho cógido en tu habitual httpd.conf serviría? (habría que probarlo, de hecho hace mención a que "incluye" dicho archivo en el httpd.conf .. vamos que es una forma tan sólo de "separar" configuración particular de algo como en este caso es PHP, como podría ser para usar Perl .. etc.. bajo ese servidor HTTP).

Supongo que con eso ya podrás subir tus archivos más pesados .. pero no obstante revisa tambíen o aclara:

Cuando dices "subir archivos a Mysql" .. ¿como gestionas tu archivo en Mysql? .. guardas el archivo en binario o sólo la referencia del nombre del archivo?.

¿Has comprobado si en tu /xyz sube el archivo temporal (con nombre aleatório y del tamaño esperado)?

¿Que mensaje de error obtienes en el proceso? (tal vez un "404 página no encontrada"? al superar dicho límite)

¿Has verificado que los cambios efectuados a tu php.ini se han realizado? (haciendo un phpinfo() lo puedes ver .. Sobre todo recuerda que cada cambio en tu php.ini implica que debes reiniciar tu servidor (al menos el servicio de Apache si lo instalastes PHP como módulo de este).

Un saludo,

Última edición por Cluster; 04/05/2005 a las 10:07
  #4 (permalink)  
Antiguo 04/05/2005, 16:21
 
Fecha de Ingreso: octubre-2004
Mensajes: 82
Antigüedad: 19 años, 6 meses
Puntos: 1
Ok seguimos con este caso

Gracias por sus respuestas, voy por partes:

sism82

Apache si tiene el archivo que menciono lo tiene en esta ruta:
/etc/httpd/conf.d/php.conf

*** de echo lo tengo asi, pero no se utiliza por que vuelvo a repetir
no levanto este servidor ya que no lo instale (me imagino que te crea este ruta
aunque no este instalado por completo el Apache)

Sobre algún error no marca ninguno por que no hay tal, en la estructura de mi código
inserto datos en 5 tablas simultaneamente y solo en la que subo el archivo no me inserta ningun
dato, pero en las 4 restantes lo hace bien; tendria que programar para que me reporte cuando NO
se haya ejecutado lo de insertar o subir el archivo.



Cluster

el Apache que instale es la version 2.0.48 y no trae de echo la ruta del .../conf.d/
solo trae la del .../conf

Sobre lo que dices te platico:

1.- Lo que hice fue colocar el codigo:

<Files *.php>
SetOutputFilter PHP
SetInputFilter PHP
LimitRequestBody 33554432 <---------------------------- si fueran 32M
</Files>

dentro del httpd.conf y reiniciar el servidor y no funciono

2.- crear el directorio /conf.d y dentro de este el archivo "php.conf" y pegar el codigo de arriba ademas de otros parametros que
tiene este archivo (lo copie de la ruta mencionada /etc/httpd/conf.d/php.conf)
al parecer no tiene parametros mas que reconocer los archivos php, y otra que no
recuerdo bien pero nadamas. E hice referencia a ese archivo dentro del httpd.conf

igual reinicie el servidor y nada, sigue sin jalar.

Y si guardo los archivos en binario de echo en un campo mediumblob y despues modifique a un longgblob por si la dudas
pero nada que ver.


Sobre lo de comprobar si sube el archivo al directorio temporal la verdad es que lo he checado
pero no se que onda por que ni con archivos de tamaño pequeño los puedo ver, sin embargho suben
sin problemas al manejador tanto en Windows como en Linux, ¿se tiene que ver el archivo
fisicamente el la ruta del upload_tmp_dir ?


tendre que checar la pagina que me dices y hacer un is_uploaded_file(); para
verificar que en realidad no sube el archivo ya que como lo tengo se supone que sube;
ademas me ecncontre que habia que configurar el http.conf con esta referencia:

Include conf/addon-modules/php.conf

Un saludo y cualquier seguire con este problema; si lo soluciono antes les comento
  #5 (permalink)  
Antiguo 04/05/2005, 16:27
 
Fecha de Ingreso: octubre-2004
Mensajes: 82
Antigüedad: 19 años, 6 meses
Puntos: 1
me equivoque

donde hay que hacer la configuracion no es en el httpd.conf sino en el php
Un saludo y checare si jala.
  #6 (permalink)  
Antiguo 06/05/2005, 21:48
 
Fecha de Ingreso: octubre-2004
Mensajes: 82
Antigüedad: 19 años, 6 meses
Puntos: 1
Sigue igual

Saben ya he configurado todo y no se soluciona el problema; ademas quiero aclarar que tampoco en Windows funciona, Yo habia comentado que SI, lo que sucedia es que mi aplicación me decia que subia correctamente pero nunca me di a la tarea de abrir los archivos subidos a Mysql, pero bueno al leer detenidamente este link:

http://www.forosdelweb.com/showthrea...chivos+grandes

en la parte de hasta abajo menciona la solucion que le dieron, y parece ser que efectivamente el problema es el codigo de la programacion que se realize, este es la estructura basica del script que manejo:

<?
$archivo = $_FILES["archivito"]["tmp_name"];
$tamanio = $_FILES["archivito"]["size"];
$tipo = $_FILES["archivito"]["type"];
$nombre = $_FILES["archivito"]["name"];
$titulo = $_POST["titulo"];
if ( $archivo != "none" )
{
// ESTA ES LA PARTE DEL PROBLEMA
$fp = fopen($archivo, "rb");
$contenido = fread($fp, $tamanio);
$contenido = addslashes($contenido);
fclose($fp);

$qry = "INSERT INTO archivos VALUES
(0,'$nombre','$titulo','$contenido','$tipo')";

mysql_query($qry);

if(mysql_affected_rows($conn) > 0)
print "Se ha guardado el archivo en la base de datos.";
else
print "NO se ha podido guardar el archivo en la base de datos.";
}
else
print "No se ha podido subir el archivo al servidor";
?>

comentando la parte:
$fp = fopen($archivo, "rb");
$contenido = fread($fp, $tamanio);
$contenido = addslashes($contenido);
fclose($fp);

efectivamente se inserta el resgitro en la BD, solo que el archivo subido independientemente del tamaño no se puede abrir, solo manda:

C:Tempphp47.tmp // el 47 es una secuancia por cada archivo subido

Y es que el problema que tengo que a mi no me jala COMENTADO EL CODIGO como se supone lo solucionaron, ademas de que mi aplicación ya esta funcionando en la red por lo cual no puedo modificar todo este modulo
lo mejor era haber subido los archivos a directorios especificos, que de echo lo hice pero en otra parte de mi aplicacion tal como lo muestro aqui:

$upload_tmp = $_FILES['archivoCor']['tmp_name'];
$upload_name = $_FILES['archivoCor']['name'];
$destino ="{$_SERVER['DOCUMENT_ROOT']}/pentiumonce/".$areaArt."/{$_FILES['archivoCor']['name']}";
move_uploaded_file($upload_tmp,$destino) or DIE("Upload incorrecto");

*** Si alguien se ha atorado con el primer codigo que puse arriba y lo ha solucionado para subir a MYSQL archivos mayores a 1.x MB espero sus respuestas.

Última edición por pentiumonce; 06/05/2005 a las 21:52 Razón: no se entiende una idea
  #7 (permalink)  
Antiguo 09/05/2005, 07:49
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Si usas el primer método que mencionas donde tu archivo lo subes en "binaro" a tu BD .. debes tener presente que en ese caso tienes al menos tres restricciones:

1) De PHP (en su php.ini las indica)
2) De Apache (para windows no suele tener problemas . .en Linux el famoso "php.conf" su LimitRequest.....)
3) De Mysql: por tipo de campo que usas para el campo binario "contenido" (BLOD o superior). Tambien en su configuración (my.ini o my.conf) se ajusta el tamaño de archivos que puede gestionar como "petición" (si mal no recuerdo).

Sobre el tema de gestionar archivos en Binaro sobre tu BD .. no sé si leistes este mini-tutorial .. Ahí veras como trabajar con ellos. Fijate en los comentarios sobre el tipo de campo a usar según el archivo que pretendas almacenar además del resto de configuración de PHP que va afectar a que puedas gestionar dicha cantidad de datos.

http://www.forosdelweb.com/f18/tutorial-ejemplo-subir-archivos-bd-guardando-bd-binario-127775/

Un saludo,
  #8 (permalink)  
Antiguo 09/05/2005, 10:29
Avatar de sism82  
Fecha de Ingreso: octubre-2003
Ubicación: Guadalajara
Mensajes: 865
Antigüedad: 20 años, 6 meses
Puntos: 1
Cita:
Iniciado por pentiumonce
sism82
Apache si tiene el archivo que menciono lo tiene en esta ruta:
/etc/httpd/conf.d/php.conf
El archivo php.conf que mencionas no es parte "oficial" de la distribución estándar de Apache o el módulo mod_php. En Apache tu puedes incluir tantos archivos como quieras para administrar el servidor, es decir, puedes incluir "elarchivoquequieras.conf" siempre y cuando tenga sintaxis válida para Apache. Igualmente cada distribución de Linux (nunca nos dijiste cual usas) administra los archivos en lugares diferentes, algunos tratan de ser estandár, pero no siempre es posible. En mi caso uso GNU/Linux Gentoo, php.conf nunca ha existido como tal.

Ahora. Como veo que estás leyendo con la opción 'b' de fopen, asumo que pueden ser datos binarios como imágenes. De ser así asegurate de tener tu campo BLOB, TINYBLOB o similar, lo que se ajuste a las necesidades del tamanio del archivo.

Sigue las indicaciones que ya te dió cluster sobre los 3 puntos que debes considerar, php.ini, php.conf y la base de datos mysql.

un saludo
  #9 (permalink)  
Antiguo 09/05/2005, 10:30
Avatar de sism82  
Fecha de Ingreso: octubre-2003
Ubicación: Guadalajara
Mensajes: 865
Antigüedad: 20 años, 6 meses
Puntos: 1
un tutorial excelente para tu caso:

http://www.onlamp.com/pub/a/php/2000...ql.html?page=1
  #10 (permalink)  
Antiguo 09/05/2005, 19:37
 
Fecha de Ingreso: octubre-2004
Mensajes: 82
Antigüedad: 19 años, 6 meses
Puntos: 1
Ok

Parece que no me entendieron bien, les comento que UTILIZO los 2 metodos, solo que el que me falla es el 1ero. (subir los binarios a Mysql) ademas antes habia explicado:

SÍ guardo los archivos en binario de echo en un campo ***mediumblob*** y despues modifique a un ***longgblob*** por si la dudas
pero nada que ver.

Es decir sobre las restricciones todas estan consideradas, solo me falta la que mencionas a cerca de su configuración en MySql(my.ini o my.conf) por lo cual lo checare.

Cluster acerce del Tutorial, ya lo habia visto de echo mi codigo es muy similar:

http://www.mysql-hispano.org/page.php?id=11&pag=1

sism82 sobre el tutorial que tu mencionas, lo mismo es muy parecido, y de echo lo pueden checar ustedes casi estoy seguro que en ambos tutoriales no suben archivos mayores a 1000 Kb a Mysql (Yo antes creia que funcionaban bien, hasta que me di a la tarea de abrir un archivo GRANDE y NO abre).


Ademas al inicio de mi problema les comente todo:

... Necesito subir archivos a MySql entre 2M a 10M, programando las aplicaciones en PHP y utilizando Apache como servidor, *** montado en Fedora Core ***; he configurado lo siguiente en PHP: ...

Insisto el problema es en la parte del codigo:

// ESTA ES LA PARTE DEL PROBLEMA
$fp = fopen($archivo, "rb");
$contenido = fread($fp, $tamanio);
$contenido = addslashes($contenido);
fclose($fp);

pero no entiendo por que funciona para archivos pequeños y para los grandes NO. Seguire en lo mismo.
  #11 (permalink)  
Antiguo 09/05/2005, 22:09
 
Fecha de Ingreso: octubre-2004
Mensajes: 82
Antigüedad: 19 años, 6 meses
Puntos: 1
Parece que ya esta solucionado.

Que tal, les platico que al parecer ya ha quedado solucionado mi problema al menos en WINDOWS, ya que no subia archivos mayores a 1MB, aclaro que pense por mucho tiempo que el método para subir los archivos al manejador con scripts que contienen codigo similar a este:

$fp = fopen($archivo, "rb");
$contenido = fread($fp, $tamanio);
$contenido = addslashes($contenido);
fclose($fp);

no funcionaban, pero NO nada de eso ya que jalan sin ningun problema.

La solución que le di fue la unica que me faltaba (que antes ya sabia que existia pero como no me marcaba ningun error Mysql no crei que fuera por hay, ademas de que no encontraba ese archivo de configuracion de Mysql jejejee, asi que ahora lo busque hasta dar con el) y fue la que me hizo saber Cluster, configurar el archivo:

(my.ini o my.conf) //my.ini en mi caso y esta en c:\windows\my.ini

y agregarle la siguiente linea:

set-variable = max_allowed_packet=10M // para 10MB


la siguiente linea solo la descomente(le quite el #):

set-variable=key_buffer=10M

pero con la de arriba es mas que suficiente ya que lo comprobe, aunque al final deje la de abajo tambien configurada. Debo decir que mi version de Mysql es la 5.0.0

Asi es que si alguien tuvo el mismo problema que Yo, esta es una de las soluciones, repito esta comprobado en WINDOWS, lo siguiente es hacer los mismo en GNU/LINUX que en cuanto lo haga les cuento (pienso que igual debe solucionarse); una vez que quede comprobado en GNU/LINUX cambiare el nombre a este POST de:

subir archivos grandes a Mysql en Linux

a

subir archivos grandes a Mysql en Windows o Gnu/Linux.
  #12 (permalink)  
Antiguo 13/05/2005, 18:04
 
Fecha de Ingreso: octubre-2004
Mensajes: 82
Antigüedad: 19 años, 6 meses
Puntos: 1
Solucionado !!!

Que paso, ya lo probe en Linux tambien y me costo tambien algo de trabajo pero bueno al fin lo solucione: chequen este link que he puesto, estan los pasos que deben hacer y el ultimo problema que tuve ya que no tenia el archivo my.cnf de MySQL:


http://www.forosdelweb.com/showthrea...08#post1093908

Un saludo.
  #13 (permalink)  
Antiguo 24/08/2005, 11:57
 
Fecha de Ingreso: mayo-2005
Mensajes: 3
Antigüedad: 18 años, 11 meses
Puntos: 0
tengo el mismo problema y no jala

Hola he visto todo esta debate, y tengo el mismo problema, no pudo subir archivos a mi servidor de mas de 1.x Megas, en Mozilla me saca un error como el "the document contains no data" y en IE sale que no se pudo encontrar URL o algo asi (pero solo cuando subo archivos de mas de 1.x MB). he cambiado toda la configuracion y he hecho todo lo que dice aqui, pero aun asi nada. mi codigo es como el siguiente.

$upload = $_FILES[upload];
$upload_tmp = $_FILES['archivoCor']['tmp_name'];
$upload_name = $_FILES['archivoCor']['name'];
$destino ="{$_SERVER['DOCUMENT_ROOT']}/pentiumonce/".$areaArt."/{$_FILES['archivoCor']['name']}";
move_uploaded_file($upload_tmp,$destino) or DIE("Upload incorrecto");
echo "<BR><BR><BR>Archivo cargado correctamente";


he reiniciado el apache, la configuracion php.ini lo he modificado, tambien cree el php.conf, aunque en este archivo lo coloque de esta manera.
<Files *.php>
# SetOutputFilter PHP
# SetInputFilter PHP
LimitRequestBody 9524288
</Files>

Ya que cuanda dejaba los : (SetOutputFilter PHP y SetInputFilter PHP) sin comentar, me salia un error cuando reiniciaba el apache.bueno no se que mas hacer, o si puedo utilizar el condigo de :

$archivo = $_FILES["archivito"]["tmp_name"];
$tamanio = $_FILES["archivito"]["size"];
$tipo = $_FILES["archivito"]["type"];
$nombre = $_FILES["archivito"]["name"];
$titulo = $_POST["titulo"];
if ( $archivo != "none" )
{
// ESTA ES LA PARTE DEL PROBLEMA
$fp = fopen($archivo, "rb");
$contenido = fread($fp, $tamanio);
$contenido = addslashes($contenido);
fclose($fp);

para guardarlo en mi disco duro pero una vez que tenga el $contenido como lo guardo en un archivo.

bueno si me pueden ayudar con esto se los agradeceria.

mi version de php es 4.1.2.

bye.
  #14 (permalink)  
Antiguo 24/08/2005, 14:44
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
jhonrami12 tu que S.O. usas en tu servidor?

El tema del dichoso "php.conf" no es que lo crees y listo .. sino que además hay que decirle en tu httpd.conf que vas a vincular ese archivo externo .. de hecho es lo mismo que si lo pones directamente (esa directiva <....> ....</....>) en tu httpd.conf .. lo único que sucede es que si lo tienes por separado resulta más ordenado buscar alguna configuración concreta de algo específico como pueda se la de PHP. Supongo que habrás hecho todo esto por qué al parecer está actuado dicha configuración.

Por otro lado has puesto muchas pruebas (código) .. incompleto (no está el HTML que acompaña a ese código para ver como se llama tu campo "file" y como codificas el formulario).

Por lo dicho:
1) Indica que configuración de PHP usas al respecto .. no sé si has modificado todas las directivas que aquí se comentaron.
2) Pon todo el código completo que usas .. incluido los formularios donde está ese campo "file" ..
3) Indica que S.O. usas en tu servidor ..

Puedes ver también la documentación oficial de PHP al respecto:
http://www.php.net/manual/en/features.file-upload.php

Sobre todo:
http://www.php.net/manual/en/feature...n-pitfalls.php

Un saludo,



Un saludo,
  #15 (permalink)  
Antiguo 04/01/2006, 14:05
 
Fecha de Ingreso: enero-2006
Mensajes: 4
Antigüedad: 18 años, 3 meses
Puntos: 0
holas tengo un problema, todo me funciona muy bien pero al descargar archivos comprimidos y cuando quiero abrirlos me sale que estan dañados

Por favor alguien puede ayudarme ??
  #16 (permalink)  
Antiguo 04/01/2006, 14:21
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Este tema se trata del proceso contrario "subir" archivos al servidor .. no de "bajarlos".

Inicia un nuevo tema e indica el código completo que usas para descargar el archivo y/o subirlo también.

Un saludo,
  #17 (permalink)  
Antiguo 27/03/2008, 18:26
 
Fecha de Ingreso: marzo-2008
Mensajes: 1
Antigüedad: 16 años
Puntos: 0
Re: subir archivos grandes a Mysql en Linux

PARA PENTIUMONCE Y A TODOS EN ESTE FORO

Saludos a Todos ....

Estoy experimentando el mismo problema expuesto en este foro.
he realizado los pasos aqui expuestos sin obtener una solucion satisfactoria.

Mi Problema es el mismo que tu Expones : !!!! NO ME PERMITE ADICIONAR ARCHIVOS GRANDES EN MI BASE DE DATOS. !!!! solo admite archivos de Maximo 1 MB.

he realizado los Pasos que tu planteas; es decir modificar el "My.ini"

my.ini o my.conf) //my.ini en mi caso y esta en c:\windows\my.ini

y agregarle la siguiente linea:

set-variable = max_allowed_packet=10M // para 10MB

!!! PERO NO FUNCIONO !!! - Es mas; ingreso por el Phpmyadmin y Consulto las Variables de MySql y precisamente esta variable < max_allowed_packet > AL parecer NO ES MODIFICADA pues continua con el Valor de 1MB

Te agradeceria bastante si me puedes colaborar con alguna otra solucion.

LAS CARACTERISTICAS DE MI EQUIPO SON:
- Windows XP SP2
- MySql 3.023
- Php 4.14
- Apache 2.23

!!! OS AGRADEZCO DE ANTEMANO !!!!
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 20:47.