Tema: Configuraciones para subir archivos binarios grandes a MySQL.
Pregunta: ¿ Como subir archivos grandes a MySQL en Windows/Linux ?
Respuesta:
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:
Aqui 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 tambien este link:
http://www.forosdelweb.com/f18/subir-archivos-grandes-mysql-linux-294768/
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:
# PHP Configuration for Apache
# Load the apache module
#LoadModule php4_module modules/libphp4.so
# Cause the PHP interpreter handle files with a .php extension.
### ESTO SERÁ LO IMPORTANTE
<Files *.php>
SetOutputFilter PHP
SetInputFilter PHP
LimitRequestBody 10240000 // PARA 10MB o +
</Files>
### LO ANTERIOR FUE LO IMPORTANTE
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
# Add index.php to the list of files that will be served as directory
# 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
# Dynamic Shared Object (DSO) Support
# To be able to use the functionality of a module which was built as a DSO you ...
LoadModule php4_module modules/libphp4.so
### 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 basico que encuentran en este mismo foro y con eso jala, les dejo el codigo, 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 "<BR><BR><BR>Archivo cargado correctamente";
Un saludo.