Subir varias imágenes y guardar la ruta en base de datos

Pedon por preguntarte directamente estoy desarrollando un proyecto soy nuevo en esto de PHP crees que podrías ayudarme en lo siguiente por favor necesito entregar esta parte el jueves y no logro hacerlo...

Te explico mi código y al final mi duda por favor

Tengo un form que me sube una carpeta entera de imágenes. Antes subía el zip pero lo modifique para subir una carpeta no comprimida

Antes solo tenia esto:

<input id="files" type="text" name="txtjpg" size="67" />

Subir ZIP, contenedor de imágenes JPG

En mi upload.php, pongo las rutas donde se guardaran

// Ruta donde se guardarán las imágenes
 $directorio = $_SERVER['DOCUMENT_ROOT'].'/upload/';
 $directorio_web = '/upload/';

y recibo los datos del form,

antes solo tenia esto

// Recibo los datos del campo Subir ZIP, contenedor de imágenes JPG
$nombrejpg = $_FILES['txtjpg']['name'];
$tipojpg = $_FILES['txtjpg']['type'];
$tamanojpg = $_FILES['txtjpg']['size'];

// Recibo los datos del campo Subir ZIP, contenedor de imágenes JPG
 $nombrejpg = $nombrejpg."%".$_FILES['txtjpg']['name'];
 $tipojpg = $tipojpg."%".$_FILES['txtjpg']['type'];
 $tamanojpg = $tamanojpg."%".$_FILES['txtjpg']['size'];

Declaro $var = $var."%".$_FILES[ para guardar una cadena de archivos en un campo de mi base de datos creo que aquí necesito ayuda o esta mal o que debo hacer o no se mas abajo explico....
Con esta parte subo el conjunto de archivos al server

Antes no tenia esto

foreach ($_FILES['txtjpg']['name'] as $i => $name) 
 {
 if (strlen($_FILES['txtjpg']['name'][$i]) > 1) 
 {
 move_uploaded_file($_FILES['txtjpg']['tmp_name'][$i], $directorio.$name);
 }
 }

Esta es mi consulta para guardar en la DB

$sql = "INSERT into he_upload_estudios (username, fecha_estudio, estudio, tipo_estudio, clinica, medico, detalle, pdf, jpg, dicom) values 
 ('$usuario','$fecha','$estudio','$testudio','$hospital','$especialista','$detalle','".$directorio_web.$nombrepdf."','".$directorio_web.$nombrejpg."','".$directorio_web.$nombredicom."')";
 $resultado = mysql_query($sql);

Hasta aquí todo marcha de maravilla me sube los archivos a la carpeta al servidor
Pero el detalle es que en el campo JPG de la base de datos solo me almacena esto /upload/%Array y mi código para mostrar las imágenes es este... Antes de modificar lo de arriba subía un archivo zip y si me lo descargaba pero lo que quiero es mostrar en pantalla las imágenes que subí.

<a href="<!--?php echo $rsemp['jpg']; ? -->">

Todo lo que te menciono que tenia antes me funcionaba perfectamente al subir un archivo o una sola imagen etc etc el archivo me lo descargaba y la imagen me la mostraba en pantalla en automático con mi explorador al dar click en el enlace, quisiera subir varias imágenes para que al darle click me las muestre en auto en el explorador, pero al hacerlo con este código que te enseño nada más no me muestra nada por que en la DB solo me almacena /upload/%Array y no la ruta de todas las imágenes que subí, he hecho pruebas quitando la cadena$var = $var."%".$_FILES[ y solo poniendo $var = $_FILES[ pero de igual manera solo me almacena /upload/Array

Sin el caracter %

Por favor si pudieras ayudarme o apoyarme en como puedo subir varias imágenes y almacenar la ruta en DB y con un solo vinculo llamar a todas las imágenes ya he estado buscando y buscando y no puedo lograr nada, o ben si pudieras indicarme como hacerle si hay alguna otra forma de lograr lo que quiero.

2 respuestas

Respuesta
1

A ver, en realidad yo no haría lo que tu estas haciendo, ya que tu aplicación puede recibir un php por ejemplo que grabará y copiará en la carpeta, creo que a no ser que tengas un buen control de lo que se sube y no al servidor (y en lo que me has mostrado no lo hay) tu aplicación se puede ver afectada por un ataque.

Ahora bien, si lo quieres así, si es algo privado, un trabajo sin mas trascendencia (nunca estará en producción), etc.. pues dejalo como está. Tratemos de resolver tu problema:

Lo que te está poniendo array es que antes no era un array, pero ahora si, ya que considera las entradas del array como las imágenes que contiene la carpeta. ¿De hecho estas recorriendo ese array para mover las imágenes no?

Entiendo que mueves todas las imágenes de todos los registros al directorio uploads y después según en registro tienes un campo imágenes que contendría los nombres de las imágenes separados por un % (si no, no se el por qué de ese % tampoco), entonces creo que lo único que necesitas para grabar en BD lo que quieres, es meter la siguiente linea dentro del foreach y del if

 $nombrejpg = $nombrejpg."%".$_FILES['txtjpg']['name'];

E indicar qué elemento del array es el que se quiere obtener, el foreach quedará algo así:

foreach ($_FILES['txtjpg']['name'] as $i => $name) 
 {
    if (strlen($_FILES['txtjpg']['name'][$i]) > 1) 
    {
        move_uploaded_file($_FILES['txtjpg']['tmp_name'][$i], $directorio.$name);
        $nombrejpg = $nombrejpg."%".$_FILES['txtjpg']['name'][$i];
    }
}

No te indico el tipo y el tamaño porque no creo que tengas problemas para, en caso de necesitarlos, comprender lo que sucedía y aplicar tu mismo la solución ;)

Con esto creo que tendrás %imagen1.jpg%imagen2.png%imagen3.jpg%img4.jpg

¿Es lo que necesitabas?

Yo lo que suelo hacer es tener las imágenes separadas de los productos (por ejemplo), una tabla imágenes con el id de la tabla relacionada y al obtener filtras por ese id_producto.

Eso si, tendrías que controlar en el foreach qué se está mandando en esa carpeta subida y qué se permite mandar, un filtro que sólo permita imágenes es muy importante para lo que te expliqué para evitar ataques. En la documentación de php puedes encontrar la manera 'tradicional' de subir múltiples imágenes.

http://php.net/manual/en/features.file-upload.multiple.php

Mmmm repasando lo que te he escrito, no tengo muy claro si lo que te he puesto es lo que necesitas. La solución es esa pero quizás la sintaxis no es la adecuada. Tepongo comentarios en el código

foreach ($_FILES['txtjpg']['name'] as $i => $name) 
 {
    if (strlen($_FILES['txtjpg']['name'][$i]) > 1) 
    {
        move_uploaded_file($_FILES['txtjpg']['tmp_name'][$i], $directorio.$name);
        // el problema es que no se si $_FILES['txtjpg']['name'][$i] te devuelve el nombre
        // o si te devolvera object u otra cosa. Si no te funciona, creo que $name puede contener
        // El nombre del archivo, me he hecho un lio un poco, pero la solucion es esta basta con dar
        // con la variable que tiene el nombre
        // comprueba qué valor tiene cada una para dar con la que necesitas    
        // o esto
        $nombrejpg = $nombrejpg."%".$_FILES['txtjpg']['name'][$i];
        // o esto
        $nombrejpg = $nombrejpg."%".$name;
    }
}
Respuesta
1

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas