2012-04-26 11 views
5

He creado este asistente de formularios web, que consta de varias páginas PHP. En esta serie de páginas, los usuarios pueden completar el formulario y los datos se almacenan temporalmente en una sesión y en la última página las sesiones se usan para almacenar todos los datos en la base de datos MYSQL. Todo funciona bien con la excepción del archivo cargado. Aquí está mi código:¿Cómo almacenar la carga de fotos en una sesión de PHP?

HTML: wizard_page2

<form name="registratieformulier" method="post" enctype="multipart/form-data" action="sw3.php"> 

    <tr><td>Foto winkel uploaden: </td><td><input type="file" name="uploadfoto"/></td></tr><br /><br /> 

     <tr><td><strong>Omschrijving van winkel:</strong></td>     </tr><br /> 

     <tr><textarea cols="50" rows="7" name="omschrijvingwinkel"></textarea></tr> 
     <input name="pkbedrijven" value="<?php echo($pkbedrijven); ?>" type="hidden" /> 
    <input type="submit" name="stuurfoto" value="Verzenden" /> 

</form> 

PHP: wizard_last_page

$_FILES['uploadfoto']['name']  = $_SESSION["naamfoto"]; 
    $_FILES['uploadfoto']['tmp_name'] = $_SESSION["tijdelijk"]; 

    $bn = $_SESSION["wn"]; 

    $target_path = "../../winkels/$bn/"; 

     $target_path = $target_path . basename($_FILES['uploadfoto']['name']); 


    move_uploaded_file($_FILES['uploadfoto']['tmp_name'], $target_path)or die("There was an error uploading the file, please try again!"); 
    $foto_path = "http://mywebsite.nl/winkels/$bn/".basename($_FILES['uploadfoto']['name']); 


    $omschrijving = $_SESSION["omschrijving"]; 

    $add = "UPDATE winkelprofiel SET winkelomschrijving='$omschrijving', winkelfoto='$foto_path' WHERE fkBedrijvenID=$pkbedrijven "; 
    $query_upload = mysql_query($add) or die("De winkelfoto en omschrijving konden niet worden opgeslagen"); 

Respuesta

7

La matriz $_FILES sólo contiene información sobre el archivo que se ha subido en esta solicitud. Si no guarda ese archivo en otro lugar dentro de la misma solicitud, PHP lo eliminará al final de la solicitud. No puede simplemente guardar $_FILES['uploadfoto']['tmp_name'] en la sesión y esperar que el archivo siga allí más tarde, porque no será así. Tampoco tiene sentido asignar los valores en $_SESSION de vuelta al $_FILES, no recuperará el archivo.

Lo que hay que hacer:

  1. si la carga se ha realizado con éxito, mover $_FILES['uploadfoto']['tmp_name'] en otro lugar inmediatamente
  2. guardar la ubicación lo ha movido a en $_SESSION
  3. hacer algo con ese archivo en $_SESSION al final de su proceso de varias páginas (ya no es necesario $_FILES)
  4. tenga algún mecanismo para eliminar los archivos cargados viejos, en caso de que el usuario abandone la sesión y el archivo nev er se usa
+0

¿Qué función recomendaría utilizar para mover el archivo rename() o copy()? –

+1

'move_uploaded_file' – deceze

3

Creo que el problema es que el archivo ubicado en $ _FILES ['uploadfoto'] ['tmp_name'] solo estará disponible cuando se cargue. Incluso si almacena el valor en sesión, el archivo no estará allí cuando acceda a wizard_last_page. Necesita manejar los archivos cargados de inmediato en la solicitud POST.

Por lo tanto, debe mover el archivo a $ target_path o cualquier lugar temporal cuando se cargue, luego guarde $ target_path en la sesión para poder acceder al archivo más adelante en wizard_last_page.

+0

¿Qué función recomendaría usar para mover el archivo rename() o copy()? –

+0

Iría con rename() para mover el archivo, ya que copy() hace una copia del archivo fuente. – mask8

1

Bueno, primero puede cargar el archivo en una ubicación temporal. Luego, en la última página, una vez que envíe el formulario, puede transferir el archivo a la ubicación deseada y luego eliminar el temporal.

$_SESSION['file'] = $_FILES["file"]["name"]; 

if (file_exists("uploads/" . $_FILES["file"]["name"])) 
     { 
     echo $_FILES["file"]["name"] . " already exists. "; 
     } 
    else 
     { 
     move_uploaded_file($_FILES["file"]["tmp_name"],"uploads/temp/" . $_FILES["file"]["name"]); 
     }; 


//This for the last page. 
$file = file_get_contents("uploads/temp/".$_SESSION['file']); 
file_put_contents("uploads/".$_SESSION['file'], $file); 
1

No estoy de acuerdo con la respuesta aceptada. Hay una forma de almacenar todas las imágenes en la variable de matriz de sesión. Puede usar la función "file_get_contents" para almacenar los datos de la imagen. Tener un vistazo a esto:

$_SESSION['imgArrayFile'][] = $_FILES['file']; //Your file infromations 
    $_SESSION['imgArrayName'][] = $_POST["ImgNewNamePlacowki"]; //new name for img 
    $_SESSION['ImgArrayAlt'][] = $_POST["ImgAltPlacowki"]; // alt tags if you use them 
    $_SESSION['obj_image_session'][] = file_get_contents($_FILES['file']['tmp_name']); 
    //above "file_get_contents" function - store image as a long string. 

Independientemente de lo que otros piensan acerca de su uso para este propósito que puede hacer el trabajo para usted. Hay varios problemas con el almacenamiento de datos grandes en la sesión, pero si las imágenes son lo suficientemente pequeñas y usted es consciente de la limitación de su configuración, entonces estará bien.

guardar el archivo con

$file= $destination."/".$filename; //images/new.jpg 
$fp=fopen($file,"w"); 
fwrite($fp,$_SESSION['obj_image_session'][$index]); 

ejemplo de mi (TRABAJO) PROYECTO:

<?php 
//$galery_img_folder = "your/new/image/destination"; 

foreach($_SESSION['imgArrayFile'] as $index => $name){ 
    if($_SESSION['imgArrayName'][$index]!="" 
    && $_SESSION['ImgArrayAlt'][$index]!="" 
    && $_SESSION['obj_image_session'][$index]!="" 
){ 

    $allowedExts = array("gif", "jpeg", "jpg", "png"); 
    $temp = explode(".", $_SESSION['imgArrayFile'][$index]["name"]); 
    $extension = end($temp); 
    if ((($_SESSION['imgArrayFile'][$index]["type"] == "image/gif") 
    || ($_SESSION['imgArrayFile'][$index]["type"] == "image/jpeg") 
    || ($_SESSION['imgArrayFile'][$index]["type"] == "image/jpg") 
    || ($_SESSION['imgArrayFile'][$index]["type"] == "image/pjpeg") 
    || ($_SESSION['imgArrayFile'][$index]["type"] == "image/x-png") 
    || ($_SESSION['imgArrayFile'][$index]["type"] == "image/png")) 
    && ($_SESSION['imgArrayFile'][$index]["size"] < 104857600) 
    && in_array($extension, $allowedExts)) 
     { 
      if(isset($_SESSION['imgArrayName'][$index]) && $_SESSION['imgArrayName'][$index]!=""){ 
      $rename = $_SESSION['imgArrayName'][$index]; 
      $rename = $rename.".".end($temp); 
     } 

     if ($_SESSION['imgArrayFile'][$index]["error"] > 0) 
     { 
     echo "Return Error Code: " . $_SESSION['imgArrayFile'][$index]["error"] . "<br>"; 
     } 
     else 
     { 
     $size = display_filesize($_SESSION['imgArrayFile'][$index]["size"]); 
     echo "Upload: " . $_SESSION['imgArrayFile'][$index]["name"] . "<br>"; 
     echo "Type: " . $_SESSION['imgArrayFile'][$index]["type"] . "<br>"; 
     echo "Size: " . ($size) . "<br>"; 
     echo "Temp file: " . $_SESSION['imgArrayFile'][$index]["tmp_name"] . "<br>"; 

     if (file_exists($galery_img_folder."/".$rename)) 
      { 
      $error[] = ''.$rename.' <span class="error" id="error"> this name exsists </span>'; 
      } 
     else 
      { 
      $_FILES["file"]["tmp_name"]=$_SESSION['imgArrayFile'][$index]["tmp_name"]; 
      move_uploaded_file($_FILES["file"]["tmp_name"], $galery_img_folder."/".$rename); 
      //now make use of the file_get_content variables 
      $file= $galery_img_folder."/".$rename; 
      $fp=fopen($file,"w"); 
      fwrite($fp,$_SESSION['obj_image_session'][$index]); 
     } 
      } 
     } 
     } 
    else 
     { 
     $error[] = '<span class="error" id="error"> Niewłaściwy plik </span>'; 
     $maxsixe = display_filesize(104857600); 
     echo "Size: " . ($maxsixe) . "<br>"; 
     } 
    } 
    }//end foreach ! ! ! 
}//end dodawanie zdjecia 
?> 

Por supuesto que tendrá que hacer alguna pequeña modificación para hacer que funcione con su proyecto, pero mi punto era mostrarle que esto es posible.

¡Que tengas un gran día y feliz codificación!

+0

Si tiene alguna pregunta ... hágamelo saber. – DevWL

Cuestiones relacionadas