Foros del Web » Programando para Internet » PHP »

problema subiendo mas de un archivo

Estas en el tema de problema subiendo mas de un archivo en el foro de PHP en Foros del Web. Hola a todos/as. Buff que jaleo tengo. A ver os cuento. Tengo un formulario por medio del cual el visitante puede subir hasta tres imagenes ...
  #1 (permalink)  
Antiguo 27/09/2008, 09:17
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
(solucionado) problema subiendo mas de un archivo

Hola a todos/as. Buff que jaleo tengo. A ver os cuento.

Tengo un formulario por medio del cual el visitante puede subir hasta tres imagenes a la tabla 'imagenes' de la base de datos. la tabla 'imagenes' para simplificar tiene estos campos:

idimagen---autonumerico
imagen--ruta de la imagen
thumbailimg--ruta del thumbail

bien. el formulario de subida es este:

Código PHP:
echo "<form name=form action='subir.php? ENCTYPE=multipart/form-data METHOD=POST>";
echo 
"
<input type='file' name='archivo[]' ><br>
<input type='file' name='archivo[]' ><br>    
<input type='file' name='archivo[]' ><br>
<input type='submit' value='Subir' >
"

el visitante puede subir una, dos o tres imagenes a la vez (en teoria).
el archivo subir.php tiene esta configuración:

Código PHP:
if (isset ($_FILES["archivo"])) 

$tot count($_FILES["archivo"]["name"]);
for (
$i 0$i $tot$i++)
{     
///funcion ahora para redimensionar la imagen
/////////////////////////////////////////////////////////////////
function redimensionar($type$img_original$img_nueva$img_nueva_anchura$img_nueva_altura$img_nueva_calidad)
{
$defecto 'img/defecto.jpg';
if(
file_exists($img_original)) {
// crear imagen desde original
$type=strtolower($type);
switch(
$type)
{
case 
'jpeg'$img ImageCreateFromJPEG($img_original); break;
case 
'jpg'$img ImageCreateFromJPEG($img_original); break;
case 
'png'$img ImageCreateFromPNG($img_original); breaK;
case 
'gif'$img ImageCreateFromGIF($img_original); breaK;
case 
'wbmp'$img ImageCreateFromWBMP($img_original); break;
default: 
$img ImageCreateFromJPEG($defecto); break;
}
} else {
$img ImageCreateFromJPEG($defecto); 
}
if(!empty(
$img)) {
$new_w_R ImageSX($img);
$new_h_R ImageSY($img);
//$img_nueva_altura = 50;
// se calcula la relación alto/ancho
$aspect_ratio $new_h_R/$new_w_R;
$aspect_ratio2 $new_w_R/$new_h_R;
if (
$new_w_R >= $new_h_R){
// se ajusta al nuevo tamaño
$img_nueva_altura abs($img_nueva_anchura $aspect_ratio);
}
else{
$img_nueva_anchura abs($img_nueva_altura $aspect_ratio2);}
// crear imagen nueva

$thumb ImageCreateTrueColor($img_nueva_anchura,$img_nueva_altura);
// redimensionar imagen original copiandola en la imagen. La imagen se reajustará al nuevo tamaño
ImageCopyResampled($thumb,$img,0,0,0,0,$img_nueva_anchura,
$img_nueva_altura,ImageSX($img),ImageSY($img));
// guardar la imagen redimensionada donde indica $img_nueva
ImageJPEG($thumb,$img_nueva,$img_nueva_calidad);
}
}
$max=1500000//tamaño máximo permitido

//inseción de imagen
//$fileName = $max."_".$_FILES['userfile']['name'];

//$fileName = $extension[0].".".$extension[1];
$fileName $referencia.".".$extension[1];

$fileSize $_FILES['archivo']['size'][$i];
$fileType $_FILES['archivo']['type'][$i]; 
$local $_FILES['archivo']['name'][$i];  
$remoto $_FILES['archivo']['tmp_name'][$i];
//echo $tmpName;
$prefijo substr(md5(uniqid(rand())),0,6);
$uploaddir "img/"

if(
$filesize $max){
ini_set("memory_limit","32M");
$uploadfile $uploaddir.$prefijo."_".$_FILES['archivo']['name'][$i];    //archivo original

if (move_uploaded_file($remoto$uploadfile)) {
chmod($uploadfile0644);

//redimensionar    
$source=$uploadfile// archivo de origen
$dest =  $uploaddir."/th_".$prefijo."_".$local//archivo thumbails
redimensionar("jpg",$source,$dest,50,50,95);//redimensionamos el archivo original a 120x120
}

$link mysql_connect("localhost","user","pass") or die('Error conectando a la base de datos.'); 

mysql_select_db("basededatos",$link) or die('Error seleccionando la base de datos.'); 
$ruta =  "img/".$prefijo."_".$local;
$rutab =  "img/peq_".$prefijo."_".$local;
$archivo=$_POST['archivo'][$i];
mysql_query("INSERT INTO imagenes(imagen,thumbailimg) VALUES ('$ruta','$rutab')");
 
 
header ("Location: exito.php"); 
Problemas:
Si subo una sola imagen no hay problema. guarda la ruta de la imagen en la base de datos en el campo imagen así como la ruta de su thumbail en el campo thumbailimg. además, sube al directorio 'img' tanto la original como la pequeña.

el problema aparece cuando subo más de una imagen. en principio debería añadir tantos registros a la tabla imagen como imagenes a subir y subir tantos archivos (con sus respectivas miniaturas) al directorio 'img'. ¿qué es lo que hace? tan sólo registra en la tabla 'imagenes' las rutas de la primera imagen a subir y sube al directorio 'img' tan solo la primera imagen junto con su thumbail. el resto de imágenes a subir ni crea nuevos registros en la tabla ni tampoco las sube al servidor. alguien sabe por qué? alguna ayuda?

Última edición por estibaliz2006; 29/09/2008 a las 02:22
  #2 (permalink)  
Antiguo 27/09/2008, 10:27
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: problema subiendo mas de un archivo

Si metes los campos File en un array como haces tu puedes recogerlos de la siguiente manera:
$_FILES['file']['name'][0] <-- Para el primero, luego 1 y asi sucesivamente.

Haz el bucle, y metes la variable FILES asi como te mostre.
Al final de cada bucle metes la consulta.

Tambien ponle un IF al bucle ... Si el campo esta vacio, usa continue; para saltar a la proxima iteracion. Asi no se procesan datos vacios y no te mostrara error.

Si el codigo no lo hiciste tu, o no sabes como hacerlo.
Creo que hay un ejemplo de como subir varios archivos en la seccion de FAQs.

Miralo aqui:
http://www.forosdelweb.com/948747-post139.html

Última edición por Ronruby; 27/09/2008 a las 10:34
  #3 (permalink)  
Antiguo 28/09/2008, 02:07
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Respuesta: problema subiendo mas de un archivo

bueno, pues nada....he hecho algunos cambios y ahora me encuentro con lo siguiente: si sube un único archivo, todo ok. si sube más de uno (recordad que antes de estos cambios lo único que hacía cuando se trataba de subir más de un archivo, era que solo subía el primero los demás nada...pero en la base de datos también insertaba únicamente el primer registro). bueno pues ahora tras los cambios, cuando tratas de subir más de un archivo, da el error:

Cannot redeclare redimensionar() (previously declared in subir.php online 8, que es donde comienza a definirse la funcion redimensionar.

qué cambios he metido? pues he seguido las faqs y tengo lo siguiente (los cambios en violeta y negrita, ok?)

formulario de subida (todo sigue como estaba)
Código PHP:
echo "<form name=form action='subir.php? ENCTYPE=multipart/form-data METHOD=POST>"
echo 

<input type='file' name='archivo[]' ><br> 
<input type='file' name='archivo[]' ><br>     
<input type='file' name='archivo[]' ><br> 
<input type='submit' value='Subir' > 
"

archivo subir.php (aquí van los cambios, ya os digo, en violeta y en negrita:
//////////////////////////////////////////////
if (isset ($_FILES["archivo"]))
{
$tot = count($_FILES["archivo"]["name"]);
for ($i = 0; $i < $tot; $i++)
{

function redimensionar($type, $img_original, $img_nueva, $img_nueva_anchura, $img_nueva_altura, $img_nueva_calidad)
{
$defecto = 'img/defecto.jpg';
if(file_exists($img_original)) {
// crear imagen desde original
$type=strtolower($type);
switch($type)
{
case 'jpeg': $img = ImageCreateFromJPEG($img_original); break;
case 'jpg': $img = ImageCreateFromJPEG($img_original); break;
case 'png': $img = ImageCreateFromPNG($img_original); breaK;
case 'gif': $img = ImageCreateFromGIF($img_original); breaK;
case 'wbmp': $img = ImageCreateFromWBMP($img_original); break;
default: $img = ImageCreateFromJPEG($defecto); break;
}
} else {
$img = ImageCreateFromJPEG($defecto);
}
if(!empty($img)) {
$new_w_R = ImageSX($img);
$new_h_R = ImageSY($img);
//$img_nueva_altura = 50;
// se calcula la relación alto/ancho
$aspect_ratio = $new_h_R/$new_w_R;
$aspect_ratio2 = $new_w_R/$new_h_R;
if ($new_w_R >= $new_h_R){
// se ajusta al nuevo tamaño
$img_nueva_altura = abs($img_nueva_anchura * $aspect_ratio);
}
else{$img_nueva_anchura = abs($img_nueva_altura * $aspect_ratio2);}
// crear imagen nueva

$thumb = ImageCreateTrueColor($img_nueva_anchura,$img_nueva _altura);
// redimensionar imagen original copiandola en la imagen. La imagen se reajustará al nuevo tamaño
ImageCopyResampled($thumb,$img,0,0,0,0,$img_nueva_ anchura,
$img_nueva_altura,ImageSX($img),ImageSY($img));
// guardar la imagen redimensionada donde indica $img_nueva
ImageJPEG($thumb,$img_nueva,$img_nueva_calidad);
}
}
$max=1500000; //tamaño máximo permitido

//inseción de imagen
$fileSize = $_FILES['archivo']['size'][$i];
$fileType = $_FILES['archivo']['type'][$i];
$local = $_FILES['archivo']['name'][$i];
$remoto = $_FILES['archivo']['tmp_name'][$i];
//echo $tmpName;
$prefijo = substr(md5(uniqid(rand())),0,6);
$uploaddir = "img/";

if($fileSize < $max){
ini_set("memory_limit","32M");
$uploadfile = $uploaddir.$prefijo."_".$_FILES['archivo']['name'][$i]; //archivo original

if (move_uploaded_file($remoto, $uploadfile)) {
chmod($uploadfile, 0644);

//redimensionar
$source=$uploadfile; // archivo de origen
$dest = $uploaddir."/th_".$prefijo."_".$local;//archivo thumbails
redimensionar("jpg",$source,$dest,50,50,95);//redimensionamos el archivo original a 120x120
$x=$i;
do{
$x++;
if( $archivo != "" ){


$link = mysql_connect("localhost","user","pass") or die('Error conectando a la base de datos.');

mysql_select_db("basededatos",$link) or die('Error seleccionando la base de datos.');
$ruta = "img/".$prefijo."_".$local;
$rutab = "img/peq_".$prefijo."_".$local;
$archivo=$_POST['archivo'][$i];
mysql_query("INSERT INTO imagenes(imagen,thumbailimg) VALUES ('$ruta','$rutab')");
}
}while($x<$i);

header ("Location: exito.php");
}}}}
/////////////////////////////////////////
  #4 (permalink)  
Antiguo 29/09/2008, 02:25
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Respuesta: problema subiendo mas de un archivo

¡¡¡POR FIN!!!! Bueno....pues aquí tenéis la solución para el que pueda necesitar algo así. es un sistema que redimensiona las imágenes subidas y permite además subir más de una a la vez. supongamos que en este caso puede subir hasta cuatro (cómo máximo) imágenes. Ahí va:

formulario:

Código PHP:
echo "<form name=form onReset='return Limpiar();' action='subir.php' ENCTYPE=multipart/form-data METHOD=POST>";
echo 
"Por favor, seleccione hasta un máximo de 2 imágenes adicionales para el producto: <br><br>
<input type='file' name='archivo[]' class=caja><br>
<input type='file' name='archivo[]' class=caja><br>    
<input type='file' name='archivo[]' class=caja><br>
<input type='file' name='archivo[]' class=caja><br>    
<input type='submit' value='Subir' class=caja>
"

archivo subir.php:

Código PHP:
if (isset ($_FILES["archivo"])) 

function 
redimensionar($type$img_original$img_nueva$img_nueva_anchura$img_nueva_altura$img_nueva_calidad)
{
$defecto 'img/defecto.jpg';
if(
file_exists($img_original)) {
// crear imagen desde original
$type=strtolower($type);
switch(
$type)
{
case 
'jpeg'$img ImageCreateFromJPEG($img_original); break;
case 
'jpg'$img ImageCreateFromJPEG($img_original); break;
case 
'png'$img ImageCreateFromPNG($img_original); breaK;
case 
'gif'$img ImageCreateFromGIF($img_original); breaK;
case 
'wbmp'$img ImageCreateFromWBMP($img_original); break;
default: 
$img ImageCreateFromJPEG($defecto); break;
}
} else {
$img ImageCreateFromJPEG($defecto); 
}
if(!empty(
$img)) {
$new_w_R ImageSX($img);
$new_h_R ImageSY($img);
//$img_nueva_altura = 50;
// se calcula la relación alto/ancho
$aspect_ratio $new_h_R/$new_w_R;
$aspect_ratio2 $new_w_R/$new_h_R;
if (
$new_w_R >= $new_h_R){
// se ajusta al nuevo tamaño
$img_nueva_altura abs($img_nueva_anchura $aspect_ratio);
}
else{
$img_nueva_anchura abs($img_nueva_altura $aspect_ratio2);}
// crear imagen nueva

$thumb ImageCreateTrueColor($img_nueva_anchura,$img_nueva_altura);
// redimensionar imagen original copiandola en la imagen. La imagen se reajustará al nuevo tamaño
ImageCopyResampled($thumb,$img,0,0,0,0,$img_nueva_anchura,
$img_nueva_altura,ImageSX($img),ImageSY($img));
// guardar la imagen redimensionada donde indica $img_nueva
ImageJPEG($thumb,$img_nueva,$img_nueva_calidad);
}
}
$tot count($_FILES["archivo"]["name"]);
for (
$i 0$i $tot$i++)
{


//inseción de imagen
    
$fileSize $_FILES['archivo']['size'][$i];
$fileType $_FILES['archivo']['type'][$i]; 
$local $_FILES['archivo']['name'][$i];  
$remoto $_FILES['archivo']['tmp_name'][$i];
$prefijo substr(md5(uniqid(rand())),0,6);
$uploaddir "img/"
$max=1500000//tamaño máximo permitido
if($filesize $max){
ini_set("memory_limit","32M");

$img_gr $uploaddir.$prefijo."_".$_FILES['archivo']['name'][$i];    //archivo original
$img_th =  $uploaddir."/th_".$prefijo."_".$_FILES['archivo']['name'][$i];//archivo thumbails

if (move_uploaded_file($remoto$img_gr)) {
chmod($img_gr0644);
 
             
//redimensionar    
$source=$img_gr// archivo de origen
$dest=$img_th// archivo de origen
redimensionar("jpg",$source,$dest,50,50,95);//redimensionamos el archivo original a 50x50
}

$link mysql_connect("localhost","diego","admin") or die('Error conectando a la base de datos.'); 

mysql_select_db("pruebamul",$link) or die('Error seleccionando la base de datos.'); 
    
$ruta =  "img/".$prefijo."_".$local;
    
$rutab =  "img/th_".$prefijo."_".$local;
$archivo=$_POST['archivo'][$i];
if (
$local !=="") { 
    
 
mysql_query("INSERT INTO imagenes(imagen,imagen_th) VALUES ('$ruta','$rutab')"); 
 
header ("Location: exito.php");
}}}} 
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 21:11.