PHP: ¿Cómo subir archivos grandes a MySQL en Windows/Linux?

De Foros del Web

Que tal un saludo, aqui les escribo estas consideraciones que se me presentaron cuando quise subir archivos mayores a 1MB a MySQL y la verdad es que si me costo un buen solucionarlo, es por eso que les dejo esto, a alguien le servira se los aseguro:

Aquí les pongo los sistemas y las versiones de APM en lo que lo hice:

Windows Xp Profesional/Fedora Core 1

Apache: 2.0.48

Php: 4.3.4

Mysql: 5.0.0

chequen también este link:

subir archivos grandes a Mysql en Linux


PHP:

WINDOWS Y LINUX:

En el php.ini

file_uploads = On // en On

max_execution_time = 120 // los segundos que consideren

max_input_time = 120 // los segundos que consideren

memory_limit = 16M // por lo regular el mismo tamaño del archivo a subir o quizas mas

upload_tmp_dir = /xyz // su directorio temporal con permisos de R/W

post_max_size = 10M // el tamaño maximo de su archivo a subir

upload_max_filesize = 10M // el tamaño maximo de su archivo a subir


      • Hacer restricciones en su código a cerca del tamaño máximo de los archivos que quieren subir (para ver que en realidad sube a MySQL o NO)

SI LO VAN A HACER EN LINUX:

consideren lo siguiente:

PHP:

si no tienen este archivo (php.conf) en este directorio (conf.d) HAY QUE CREARLO:

Yo lo he creado aqui:

/usr/local/apache2/conf.d/php.conf


con el siguiente contenido en el php.conf:


  1. PHP Configuration for Apache
  1. Load the apache module
  1. LoadModule php4_module modules/libphp4.so
  1. Cause the PHP interpreter handle files with a .php extension.
      1. ESTO SERÁ LO IMPORTANTE

<Files *.php>

SetOutputFilter PHP

SetInputFilter PHP

LimitRequestBody 10240000 // PARA 10MB o +

</Files>

      1. LO ANTERIOR FUE LO IMPORTANTE


AddType application/x-httpd-php .php

AddType application/x-httpd-php-source .phps

  1. Add index.php to the list of files that will be served as directory
  1. indexes.

DirectoryIndex index.php


APACHE:

DENTRO DEL httpd.conf del Apache incluir el archivo que creamos de la siguiente manera como lo indico:

...

Listen 80

  1. Dynamic Shared Object (DSO) Support
  1. To be able to use the functionality of a module which was built as a DSO you ...

LoadModule php4_module modules/libphp4.so

      1. ASI LO INCLUYEN

Include conf.d/*.conf

...


REINICIAN EL APACHE: /usr/local/apache2/bin/

./apachectl restart



MYSQL:

WINDOWS:

Busquen el archivo de configuración de Mysql; se puede llamar así: my.ini y lo configuran:

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


y agregarle la siguiente línea:

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

la siguiente línea 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 también configurada.


LINUX:

Hacer lo mismo que en Windows solo que haora el archivo se llama: my.cnf o my.cfg o my.conf

busquenlo desde la consola asi: locate my.cnf si no lo encuentra el sistema busquenlo ustedes mismos, debe de estar ubicado en: /etc/my.cnf; una vez localizado lo configuramos:


en la sección [mysqld] editamos o agregamos (según su caso):

key_buffer = 16M

max_allowed_packet = 10M // los 10 MB

table_cache = 64

sort_buffer_size = 10M // Yo lo deje asi

read_buffer_size = 10M // Yo lo deje asi

myisam_sort_buffer_size = 8M

OJO: mysql tiene por default 4 archivos de configuración para que los editemos y estos son y estan en:

/usr/local/mysql/support-files/

my-huge.cnf

my-large.cnf

my-medium.cnf

my-small.cnf


CHEQUENLOS Y PUEDEN EDITARLOS LES ACONSEJO QUE LO HAGAN UNICAMENTE EN LA SECCIÓN de [mysqld]


      • EN DADO CASO DE QUE NO HAYAN ENCONTRADO EL ARCHIVO my.cnf (como fue mi caso) hay que crearlo o copiarlo asi:

cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf

COMO LES DIJE ARRIBA ESA ES LA RUTA EN LA QUE DEBE DE ESTAR: /etc/my.cnf. Apartir de hay, modifican lo que les comento, pero principalmente estas 2 lineas:

key_buffer = 16M

max_allowed_packet = 10M // los 10 MB


REINICIAN EL MYSQL: /etc/init.d/

./mysql.server stop

./mysql.server start


ASI ES QUE SI USTEDES QUIEREN SUBIR ARCHIVOS A MYSQL MAYORES A 1 MB CON LO ANTERIOR LO PUEDEN RESOLVER YA QUE YO LO HE RESUELTO ASÏ, Y PRINCIPALMENTE PARA AQUELLOS QUE OCUPEN CÓDIGO SIMILAR AL SIGUIENTE:

<?

$archivo = $_FILES["archivito"]["tmp_name"];

$tamanio = $_FILES["archivito"]["size"];

$tipo = $_FILES["archivito"]["type"];

$nombre = $_FILES["archivito"]["name"];

$titulo = $_POST["titulo"];

if ( $archivo != "none" )

{

$fp = fopen($archivo, "rb");

$contenido = fread($fp, $tamanio);

$contenido = addslashes($contenido);

fclose($fp);


$qry = "INSERT INTO archivos ...

para los que NO quieran subir archivos a MySQL sino que los quieran subir a su disco duro solo configuren lo básico que encuentran en este mismo foro y con eso jala, les dejo el código, probado en WINDOWS/LINUX:


$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 "


Archivo cargado correctamente";


--Pentiumonce 17 May 2005

Este artículo es parte de las FAQs de PHP y el Manual de PHP.

Herramientas personales