2009-04-15 17 views
18

È possibile memorizzare un'immagine in una SESSIONE PHP?PHP - Memorizza le immagini nei dati SESSION?

Ho un processo di registrazione multi-step utilizzando PHP sul mio sito. In uno dei passaggi, gli utenti possono caricare il loro logo aziendale (immagine).

L'ultimo passaggio consiste nell'elaborazione della carta di credito.

Quindi prima di scrivere qualsiasi immagine sul server Web e la posizione dell'immagine sul database, voglio accertarmi che la loro carta di credito sia valida ed elaborata.

Come tale, è possibile memorizzare temporaneamente i dati dell'immagine nella variabile SESSION?

In caso negativo, in quale altro modo le persone conservano temporaneamente i dati delle immagini sui moduli prima di inviare tali dati?

risposta

29

È possibile prevedere che l'utilizzo della memoria della sessione aumenterà in base alla dimensione delle immagini. Per fare ciò, è necessario salvare il contenuto del file in una variabile di sessione.

Se è in dati di sessione e dopo l'upload sono presenti più passaggi, l'immagine verrà ricaricata (nella sessione) ogni visualizzazione di pagina fino al completamento dei passaggi.

Mi raccomando personalmente di non utilizzare la sessione per contenere un file binario. Salvataggio dell'immagine su disco in una posizione temporanea fino al completamento della registrazione. Vorrei solo salvare il percorso del file temporaneo in sessione. Quando il transaciton è completato, spostalo in una posizione appropriata e inserisci i tuoi db insert.

Inoltre, in sostanza, i dati di sessione vengono memorizzati su disco (o db) in ogni caso, quindi è possibile salvare il file di immagine una volta quindi emettere un comando di spostamento una volta completato.

+2

Cosa succede se la registrazione fallisce? Come sapresti quale immagine eliminare, poiché potrebbe essere un'immagine relativa ad un'altra istanza di php? – Burimi

0

Sì, è possibile memorizzare un'immagine in una sessione PHP. Inseriscilo in PHP come stringa (cioè dati binari) e quindi puoi inserirlo nella sessione.

Si vorrà che sia grande solo quanto deve essere ed è necessario eliminarlo non appena non ne ha bisogno, poiché ampie informazioni nella sessione rallenteranno l'avvio della sessione.

3

Quando un file viene caricato, viene assegnato un nome temporaneo nell'array $ _FILES. Non conosco la durata esatta di questi file, ma potresti essere in grado di catturare quel nome nella sessione e rimandare la chiamata move_uploaded_file() fino a dopo la verifica del CC.

Oppure, è possibile eseguire prima il passo CC.

+0

Tutti i file nell'array $ _FILES vengono rimossi quando termina l'esecuzione dello script PHP, cioè tutti i file caricati vengono persi se non li si è spostati in un'altra posizione. – Serg

9

Avrei salvato il file sul disco, potevi anche chiamarlo usando l'id di sessione dell'utente. Quindi potrebbe esserci una sorta di script di pulizia che viene eseguito come un cron job ed elimina le immagini di persone che non hanno mai pagato con successo.

Se si tenta di memorizzare un'immagine nella sessione, si sta facendo male.

1

A volte è necessario visualizzare in anteprima/confermare la pagina prima di salvare i dati nel database. Ma il file immagine per la pagina di conferma è leggermente diverso. Non puoi fare $_SESSION['s_name'] = $_FILES['f_name'] coz SESSION basta mantenere il file di testo. In alternativa, mantenendo il contenuto del file/valore binario nella sessione.

$_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

Se è necessario conservare i dati, suggerirei di mantenerlo come stringa codificata in base64.È possibile inviare direttamente i dati dell'immagine base64_encode al browser.

Se mi trovassi in una situazione simile avrei preferito salvare l'immagine e mantenuto le informazioni sull'immagine in sessione/db. Se per qualche motivo la registrazione fallisce, scollegare il file in un secondo momento. e di tanto in tanto eseguono lavori cron per individuare i collegamenti mancanti con le immagini.

Ma ti suggerisco davvero di attenersi alla seconda opzione ed evitare del tutto il problema.

0

È possibile memorizzare facilmente i dati di immagine in sessione come codificati di base. Nel server di produzione si suppone di avere abbastanza RAM. La mia applicazione richiedeva fino a 40 MB di 4 immagini/app per l'aggiornamento e la modifica prima di inserirla in mongoDB. (codifica Base rende 1,3 volte più grande dimensione dell'immagine.)

$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 sarà: avete immagini multiple per caricare e sia client che server di convalida per dimensione e tipo. È più veloce da recuperare dalla sessione. Dopo aver inserito in DB null la variabile che contiene l'immagine.

browser mostrerà spettacolo che un'immagine con:

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

È possibile aggiornare la seduta per l'immagine con stringa vuota dopo il codice raggiunge la fine del blocco. Il caso tipico è l'aggiornamento del campo modulo con la convalida e quando l'utente desidera modificare il testo. Vuoi anche mostrare quale immagine è stata caricata tra quegli aggiornamenti non riusciti. Se si desidera salvare il viaggio di andata e ritorno (consigliabile) conservare i dati per alcuni momenti della sessione e svuotare il valore dopo che il codice riguarda l'uscita.

Problemi correlati