2012-06-25 6 views
5

Idioma: PHP/MySQLmatrices de formulario de carga múltiple, subir imágenes a continuación, insertar a la base de datos (PHP, MySQL)

voy fuera de mi mente, realmente tienen que pedir ahora tengo ... una forma de carga de archivos múltiples:

<input type="file" name="fileupload[]" multiple>

con la ayuda de un poco de Javascript, en cada cambio realizado en esta entrada, se anexa una lista de nombres de ficheros, + una cadena con formato (agarró por el nombre del archivo) dentro de otro de entrada , así que en cambio tenemos un diseño como se muestra a continuación (suponiendo que acabamos de agregar algunas imágenes):

Multiple Upload Form casi similar a:http://jsfiddle.net/pxfunc/WWNnV/4/


// Una representación de HTML tal disposición sería ... (suponiendo que 3 imágenes añadidas)

<input type="file" name="fileupload[]" multiple>

  • imagen-nombre-1.jpg   <input type="text" value="Image Name 1" name="keyword[]">
  • justsome_file.png   <input type="text" value="Justsome File" name="keyword[]">
  • some_Img-031.gif   <input type="text" value="Some Img 031" name="keyword[]">

<input type="submit" value="Upload">


tengo de esta manera porque además de cargar los archivos, también me gustaría o agréguelos a mi base de datos, con un título predeterminado basado en su nombre de archivo (y la opción de establecer/cambiar este título para cada imagen a medida que la cargo). No hay problema con mi formulario.

PROBLEMA: Mi dilema se encuentra dentro de la página PHP donde se envían los datos del formulario/acción.

sólo puedo manejar a cualquiera:

  • Subir imágenes correctas, pero conseguir mismo título para todos los
  • títulos
  • inserto correcto, pero conseguir la misma imagen para todos

Aquí está mi Página de acción PHP: (Actualmente cargando imágenes correctas, pero teniendo mismo título para todos)

<?php 
// CONNECT TO DATABASE... 
// INCLUDE UPLOAD CLASS LIBRARY 
include (dirname(__FILE__).'/lib/class.upload.php'); 


$files = array(); 
foreach ($_FILES['fileupload'] as $k => $l) 
{ 
    foreach ($l as $i => $v) 
    { 
     if (!array_key_exists($i, $files)) 
     $files[$i] = array(); 
     $files[$i][$k] = $v; 
     $imagename = $_POST['keyword'][$i]; 
    } 
} 

// create an array here to hold file names 
$uploaded = array(); 
foreach ($files as $file) 
{ 
      $generate_name = rand(100,99999); 
      $generate_name_extra = rand(200,9999); 
      $filenamex = "COVER_PHOTO_".$generate_name.$generate_name_extra."_".time(); 
      $filenamex_thumb = $filenamex."_thumb"; 

      $handle = new upload($file); 
      if ($handle->uploaded) { 
      $this_upload = array(); 

      ///// 1 //////////////////////////////////////////////////////////////////// 
      $handle->file_new_name_body = $filenamex_thumb; 
      $handle->file_force_extension = true; 
      $handle->image_resize   = true; 
      $handle->image_x    = '300'; 
      $handle->image_ratio_y  = true; 
      $handle->jpeg_quality = '100'; 

      // ABSOLUTE PATH BELOW 
      $handle->process($absoRoot.'covers/thumbs/'); 
      //////////////////////////////////////////////////////////////////////////// 
      if ($handle->processed) { 

     // store the image filename 
    $this_upload['image'] = $handle->file_dst_name; // Destination file name 
    $this_upload['body'] = $handle->file_dst_name_body; // Destination file name body 
    $this_upload['extension'] = $handle->file_dst_name_ext; // Destination file extension 

     $category_id = $_POST['cat']; 
     $hiddenvalues = explode ("|",$_POST["cat"]); 
     $category = $hiddenvalues[0]; 
     $category_name = $hiddenvalues[1]; 


       $sql = 'INSERT INTO cover (id, img, keyword, category_name, cat_id) VALUES ("", "'.$this_upload['image'].'", "'.$imagename.'", "'.$category_name.'", "'.$category.'")'; 
       mysql_query($sql); 
     } 

    $handle->clean(); 
     header("Location: ./upload.php"); 
       $message = ""; 
    } else { 

     echo ' file not uploaded to the wanted location'; 
     echo ' Error: ' . $handle->error . ''; 

     } 
} ?> 

(yo uso el Upload Class by Colin Verot para manejar la subida de imágenes, y sus preguntas más frecuentes tutorial para manejar la subida de imágenes múltiples en this page, under: What about multiple uploads?)

Esto funcionaría perfecto si estuviera simplemente subiendo imágenes, sin embargo he añadido la funcionalidad de añadir cada imagen de datos a mi base de datos. & Aquí es donde se vuelve confuso.

Estoy seguro de que la clave es colocar la consulta SQL dentro del foreach correcto, o tal vez hacer otra, pero he intentado que & solo me da 1 buen resultado para la carga de la imagen o el título, nunca para ambos.

Necesito subir la imagen al sitio, luego almacenar sus datos (incluida la ruta de la imagen) en mi base de datos.

Por favor, mira mi código y me aclaras cómo resolver este problema? Una pista de fragmento realmente sería genial por ahora ya que estoy muy confundido después de haber intentado todo lo que pude pensar. Muchas gracias!

+0

Limpiar el formateo del bloque y actualizar su publicación: 'if (! Array_key_exists ($ i, $ files))' –

+0

No estoy seguro de cómo hacerlo, ese bloque de código fue del tutorial de Preguntas frecuentes de la clase Upload en [esta página, en: ** ¿Qué pasa con las cargas múltiples? **] (http://www.verot.net/php_class_upload_faq.htm?PHPSESSID=accbee5eb0a694348a445a61a4e40ba1) Realmente no veo cuál es cuál de ese bloque de código , pero intenté cambiarlo antes y las cargas dejaron de funcionar, así que lo dejé allí. Yo, sin embargo, fui quien agregó la pieza: '$ imagename = $ _POST ['keyword'] [$ i];' – Mafia

+0

** ACTUALIZACIÓN: ** Recibí la respuesta correcta de [** usuario: 138383 ** , ** Aaron W. **] (http://stackoverflow.com/users/138383/aaron-w) Su comentario fue uno de los primeros, y el primero que probé funcionó, pero no pude marcarlo corrige más porque lo eliminó. Lo he notificado de alguna manera, y esperaré en caso de que quiera volver a enviarlo, y luego marcaré su respuesta como correcta. [** (Su respuesta fue ...) **] (http://i4.photobucket.com/albums/y143/cute-spot/Animatiofgdn6.gif) solo para darle crédito. Casi me muero cuando funcionó. :) – Mafia

Respuesta

1

Cuando se está reuniendo la información del archivo se desea sobreescribir $imagename en cada bucle por lo que será asignado a la última. Intente adjuntarlo a la variable $files (con suerte, esto no entra en la clase upload que está utilizando).

foreach ($l as $i => $v) 
{ 
    if (!array_key_exists($i, $files)) 
    $files[$i] = array(); 
    $files[$i][$k] = $v; 
    $files[$i]['imagename'] = $_POST['keyword'][$i]; 
} 

continuación, actualice la cadena $sql hacer referencia a que

$sql = 'INSERT INTO cover (id, img, keyword, category_name, cat_id) 
    VALUES ("", "'.$this_upload['image'].'", "'.$file['imagename'].'", 
     "'.$category_name.'", "'.$category.'")'; 
2

No está guardando la variable $ imagename en la matriz $ files, solo la está restableciendo cada vez.

$files[$i][$k] = $v; 
    $imagename = $_POST['keyword'][$i]; 

debe ser algo como:

$files[$i][$k] = array($v, $_POST['keyword'][$i]); 
    ... 
    foreach ($files as $data) { 
     list($file, $imagename) = $data; 
     ... 
    } 
2

Creo que uno de sus problemas es su foreach:

$files = array(); 
foreach ($_FILES['fileupload'] as $k => $l) 
{ 
    foreach ($l as $i => $v) 
    { 
     if (!array_key_exists($i, $files)) 
     $files[$i] = array(); 
     $files[$i][$k] = $v; 
     $imagename = $_POST['keyword'][$i]; 
    } 
} 

por lo que van a través de cada uno de los campos de asignación su valor para el archivo correcto que se ajusta a esta política de estructura:

_FILES => array(
    'name' => array(0 => 'file.txt'), 
    'size' => array(0 => 235) 
) 

Qué es lo correcto para multificheros pero luego lo hace:

$imagename = $_POST['keyword'][$i]; 

cual no se ve bien.Está sobrescribiendo la varilla cada vez que mira la última, lo que significa que solo obtendrá una entrada vlaue.

Cuestiones relacionadas