2009-04-15 26 views
18

¿Se puede almacenar una imagen en una SESIÓN PHP?PHP - ¿Almacenar imágenes en datos de SESIÓN?

Tengo un proceso de registro de múltiples pasos usando PHP en mi sitio. En uno de los pasos, los usuarios pueden cargar el logotipo de su empresa (imagen).

El último paso es procesar su tarjeta de crédito.

Así que antes de escribir cualquier imagen en el servidor web y la ubicación de la imagen en la base de datos, quiero asegurarme de que su tarjeta de crédito sea válida y procese.

Como tal, ¿es posible almacenar temporalmente esos datos de imagen en la variable SESSION?

De lo contrario, ¿cómo almacenan las personas de forma temporal los datos de imagen en los formularios antes de confirmarlos?

Respuesta

29

Puede esperar que el uso de la memoria de su sesión aumente dependiendo del tamaño de las imágenes. Para hacerlo, debe guardar el contenido del archivo en una variable de sesión.

Si está en datos de sesión y tiene varios pasos después de la carga, la imagen se volverá a cargar (en la sesión) en cada vista de página hasta que se completen los pasos.

Yo personalmente recomendaría no usar la sesión para sostener un archivo binario. Guardar la imagen en el disco en una ubicación temporal hasta que se complete el registro. Solo guardaría la ruta al archivo temporal en sesión. Cuando se complete la transacción, muévala a una ubicación adecuada y haga sus inserciones de db.

Además, en esencia, los datos de sesión se almacenan en el disco (o db) de todos modos así que también puede guardar el archivo de imagen una vez y luego emitir un comando de movimiento una vez completado.

+2

¿Qué sucede si el registro falla? ¿Cómo sabría qué imagen eliminar, ya que podría ser una imagen relacionada con otra instancia de php? – Burimi

0

Sí, puede almacenar una imagen en una sesión de PHP. Consíguelo en PHP como una cadena (es decir, datos binarios) y luego puede ponerlo en la sesión.

Querrá que solo sea tan grande como debe ser y debe eliminarlo tan pronto como no lo necesite, ya que grandes cantidades de información en la sesión ralentizarán el inicio de la sesión.

3

Cuando se carga un archivo, se le asigna un nombre temporal en la matriz $ _FILES. No sé la duración exacta de esos archivos, pero es posible que pueda capturar ese nombre en la sesión y posponer la llamada move_uploaded_file() hasta que se haya verificado el CC.

O bien, podría hacer el paso CC primero.

+0

Todos los archivos del array $ _FILES se eliminan cuando finaliza la ejecución del script PHP, es decir, todos los archivos cargados se pierden si no los ha movido a otro lugar. – Serg

9

Guardaría el archivo en el disco, incluso podría nombrarlo usando el ID de sesión del usuario. Luego podría haber algún tipo de script de limpieza que se ejecute como un trabajo cron y borre las imágenes de personas que nunca pagaron con éxito.

Si intenta almacenar una imagen en la sesión, lo está haciendo mal.

1

A veces Necesitamos una vista previa/confirmar la página antes de guardar los datos en la base de datos. Pero el archivo de imagen en la página de confirmación es un poco diferente. No puede hacer $_SESSION['s_name'] = $_FILES['f_name'] coz SESIÓN simplemente mantenga el archivo de texto. De forma alternativa, mantener el contenido del archivo/valor binario en sesión.

$_SESSION['obj_image_session'] = file_get_contents($_FILES['image_name']['tmp_name']); 

$file= "new_file.jpg"; 
$fp=($file,"w"); 

fwrite($fp,$_SESSION['obj_image_session']); 
1

Si tiene que conservar los datos, le sugiero que lo conserve como cadena base64_encoded.Puede enviar directamente datos de imagen de base64_encode al navegador.

Si estuviera en una situación similar, hubiera preferido guardar la imagen y mantener la información sobre la imagen en sesión/db. Si por alguna razón el registro falla, desvincularía el archivo más tarde. y ocasionalmente ejecuta trabajos cron para localizar enlaces perdidos con las imágenes.

Pero realmente le sugiero que se adhiera a la segunda opción y evite la molestia por completo.

0

Puede almacenar los datos de imagen en sesión como uno de base codificado fácilmente. En el servidor de producción se supone que tienes suficiente RAM. Mi aplicación necesitaba hasta 40MB de 4 imágenes/aplicaciones para actualizar y cambiar antes de instalar mongoDB. (Base de codificación hace tamaño de la imagen 1,3 veces más grande.)

$tmpNameSS1 = $_FILES["screenshot1"]["tmp_name"]; 
    $fp  = fopen($tmpNameSS1, 'r'); 
    $rawDataSS1 = fread($fp, filesize($tmpNameSS1)); 
    fclose($fp); 
    $SS1FileName = $_FILES["screenshot1"]["name"]; 
    $encodedSS1Data = base64_encode($rawDataSS1); 

    registry::update('sCreateSS1Name', $SS1FileName); 
    registry::update('sCreateSS1Data', $encodedSS1Data); 

Un caso será: tiene varios imagen para subido tanto y validación del cliente y el servidor para el tamaño y tipo. Es más rápido recuperar de la sesión. Después de poner en DB nulo la variable que contiene la imagen.

navegador mostrará muestran que la imagen con:

<img src="data:image/;base64,<?php echo registry::get('sCreateSS1Data'); ?>"/> 

Puede actualizar la sesión de la imagen con cadena vacía después de que el código llega al final del bloque. Un caso típico es la actualización del campo de formulario con validación y cuando el usuario desea cambiar el texto. También desea mostrar qué imagen se cargó entre esas actualizaciones fallidas. Si desea guardar el viaje de ida y vuelta (aconsejable) guarde los datos durante algunos momentos en la sesión y vacíe ese valor después de que el código se trata de salir.

Cuestiones relacionadas