evitare il re-upload dati con aggiornamento pagina

La pagina che ho completato per l'upload dei file adesso sembra funzionare bene.

Mi sono reso conto però che aggiornando la pagina del browser o semplicemente ritornando alla stessa da un'altra pagina vengono di nuovo inviati i dati e caricata la stessa immagine. In pratica l'operazione viene ripetuta.

Come si può evitare che ciò accada?

Grazie

inviato 6 anni fa
frankphp
X 0 X

Puoi salvare nelle sessioni la data e l'orario dell'ultimo invio. Fare un controllo se i dati inviati corrispondono a quelli inviati poco prima e in tal caso avvisare l'utente che sta sbagliando: ha ricaricato la pagina o sta tentando di inviare dati già inviati per cui dirgli: operazione già compiuta.

Ciao

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Puoi salvare nelle sessioni la data e l'orario dell'ultimo invio. Fare un controllo se i dati inviati corrispondono a quelli inviati poco prima e in tal caso avvisare l'utente che sta sbagliando: ha ricaricato la pagina o sta tentando di inviare dati già inviati per cui dirgli: operazione già compiuta.

Ciao

ma un isset o un empty() sui campi non funzionerebbero?

Grazie

risposto 6 anni fa
frankphp
X 0 X

Si e no...dipende come implementi il tuo algoritmo. Comunque devi avere da qualche parte un qualche cosa che ti dice che l'operazione è andata a termine no?

risposto 6 anni fa
Mario Santagiuliana
X 0 X
Si e no...dipende come implementi il tuo algoritmo. Comunque devi avere da qualche parte un qualche cosa che ti dice che l'operazione è andata a termine no?

ho provato varie soluzione ma mi sono incasinato.

alla fine sembra che il re-indirizzamento sia il più efficace (almeno quello che ho saputo applicare io)

nella pagina di uploader.php:

//a inizio pagina

function rindirizzo($url, $seconds = FALSE){
    if (!headers_sent() && $seconds == FALSE){
        header("Refresh: ".$seconds.";URL=" . $url);
    }
    else{
        if ($seconds == FALSE){
            $seconds = "0";
        }
        echo "<meta http-equiv=\"refresh\" content=\"$seconds;url=$url\">";
    }
}

.........

//dopo l'operazione di caricamento:

 rindirizzo("ok.php",1);

questa la semplice pagina ok.php:

function rindirizzo($url, $seconds = FALSE){
    if (!headers_sent() && $seconds == FALSE){
        header("Refresh: ".$seconds.";URL=" . $url);
    }
    else{
        if ($seconds == FALSE){
            $seconds = "0";
        }
        echo "<meta http-equiv=\"refresh\" content=\"$seconds;url=$url\">";
    }
}

echo "<br><br>
   <div align=\"center\"> 
   <table width=\"476\" height=\"124\" background=\"images/done.gif\">
   <tr><td> 
      <p align=\"center\"> <strong> Articolo caricato correttamente!</strong></td>
   </tr>
   <tr><td> 
   <p align=\"center\"> 
   <img src=\"images/apply_big.gif\">&nbsp;&nbsp; Attendi il caricamento oppure clicca <a href=\"uploader.php\">qui</a></td>
   </tr>
   </table>
   </div>";

rindirizzo("uploader.php",3);

Che ne pensi?

Grazie

risposto 6 anni fa
frankphp
X 0 X

Non capisco bene la logica...

Se un utente ha inviato i suoi file. Dal browser torna indietro o fa un refresh della stessa pagina in cui si trova...insomma reinvia le stesse cose che ti ha appena mandato....con il sistema che proponi non c'è un controllo sulla cosa o sbaglio?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Non capisco bene la logica...

Se un utente ha inviato i suoi file. Dal browser torna indietro o fa un refresh della stessa pagina in cui si trova...insomma reinvia le stesse cose che ti ha appena mandato....con il sistema che proponi non c'è un controllo sulla cosa o sbaglio?

Non c'è nessun controllo (i controlli sui campi in php li faccio ma per altre esigenze come già sai) evidente;

resta il fatto che così funziona. Ho provato a fare aggiornamento pagina dopo l'upload e il redirect e a ritornare indietro col browser e sembra che il problema non si verifichi. Continuo a testarlo comunque.

Grazie

risposto 6 anni fa
frankphp
X 0 X

Funziona ma non perfettamente...

Allora se tu torni indietro con il browser e reinvii gli stessi dati il file il problema si ripresenta.

Devi fare un controllo fra i dati appena inviati e quelli che hai appena caricato, se sono identici devi avvisare l'utente.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Funziona ma non perfettamente...

Allora se tu torni indietro con il browser e reinvii gli stessi dati il file il problema si ripresenta.

Devi fare un controllo fra i dati appena inviati e quelli che hai appena caricato, se sono identici devi avvisare l'utente.

Non so che dirti. Sto provando e riprovando ma il problema non si ripresenta (aggiornamento pagina, avanti indietro ecc ecc)

Ho una pagina che mostra tutte le immagini con i relativi dati associati di ogni singolo utente e non ci sono adesso doppioni come avveniva prima (anche se comunque già mi ero reso conto che il re-invio non si verificava più).

In ogni caso voglio andare fino in fondo a questa cosa ed essere sicuro.

Tradotto in codice tu cosa inseriresti?

Grazie

risposto 6 anni fa
frankphp
X 0 X

Farei un codice differente.

Tu fai questo:

- racolta dati ed invio dati

- elaborazione dati

- reindirizzamento ad ok.php

- presenti l'avviso di avvenuto invio e di attendere un po' di secondi per il redirezionamento

- rendirizzamento ad uploader.php

Ok, benissimo.

Se tu però riesci a riportare il browser alla situazione di raccolta dati ed invio dati ti ritrovi dei doppioni. Idem se l'utente insierisce nuovamente gli stessi dati (non so se tu vuoi permettergli di inviare gli stessi dati due volte consecutivamente).

Non viene eseguito nessun controllo sul fatto che i dati sono stati inviati o meno. Non esiste un controllo sulla corrispondenza dei degli ultimi dati inviati e quelli si stanno inviando.

Io creerei qualche cosa che faccia questo:

- racolta dati ed invio dati

- controllo sullo stato dei dati appena inviati e gli ultimi che si sono inviati

- se corrispondono avviso l'utente che ha rimandato le stesse informazioni se no procedo

- elaborazione dati

- reindirizzamento ad ok.php

- presenti l'avviso di avvenuto invio e di attendere un po' di secondi per il redirezionamento

- rendirizzamento ad uploader.php

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Io creerei qualche cosa che faccia questo:

.......

- se corrispondono avviso l'utente che ha rimandato le stesse informazioni se no procedo

.....

ok. Qui c'è un problema!

I dati non corrispondono alla perfezione in quanto il nome dell'immagine (l'upload più importante) cambia sempre

in quanto viene aggiunta al nome dell'immagine il numero timestamp con time() per rendere l'immagine non sovrascrivibile da un'altra diversa ma con lo stesso nome (mi sono accorto che in alcuni lavori del genere gli autori non tengono conto di questo e caricando un'immagine differente ma con lo stesso nome quella precedente viene cancellata. Col mio metodo questo non succede.

Tu hai perfettamente  ragione che ci dovrebbe essere un controllo più ordinato e logico sui dati però, per il momento, questa soluzione dell'header sembra andare bene. Adesso però continuo lo sviluppo del progetto mi sono bloccato parecchi giorni sulla stessa pagina. Ci tornerò appena possibile a lavorarci sopra.

Grazie dei consigli, come sempre, per me preziosi.

Ciao

risposto 6 anni fa
frankphp
X 0 X

Ok, buon lavoro  :D

risposto 6 anni fa
Mario Santagiuliana
X 0 X
Ok, buon lavoro  :D

mica tanto buono.

Ho scoperto che questa pagina con IE 7 non funziona (il re-indirizzo non c'entra niente l'ho eliminato momentaneamente)

nella pagina di cui sopra c'è questo controllo sul file immagine caricato:

.........

// Creo una array con i formati accettati
  $tipi_consentiti = array("image/gif","image/jpeg","image/png");

.............

 // verifico che il formato del file sia tra quelli accettati
  if ((@in_array($_FILES['imagefile']['type'], $tipi_consentiti))&& ($_FILES["imagefile"]["size"] < 2200000)){ 
    // copio il file nella cartella delle immagini
    @copy ($_FILES['imagefile']['tmp_name'], $carfoto_user . $nome);

..................


else{
    // stampo un messaggio di errore nel caso in cui il file sia di un formato non consentito
    echo "Impossibile eseguire l'upload. Formato non consentito o immagine troppo grande!";
  }

In pratica non riesco a caricare niente..mi ritrovo sempre con il messaggio di errore dell'ELSE di cui sopra.

Con Firefox nessun problema invece.

Come mai?

Grazie

risposto 6 anni fa
frankphp
X 0 X

Non ti so rispondere.

Mi rifiuto di lavorare con i browser IE.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Non ti so rispondere.

Mi rifiuto di lavorare con i browser IE.

a chi lo dici!!! Io lo utilizzo solo nei casi in cui devo testare un mio lavoro.

Il problema di fondo è che devo tener conto degli utenti/utonti  ;D (purtroppo la maggior parte)

che utilizzano sta cagata di browser.

Grazie

ps: in ogni caso la faccenda è molto strana. Nemmeno un'idea buttata lì a caso?

risposto 6 anni fa
frankphp
X 0 X

Ho scoperto l'errore.

IE7 ha problemi con il riconoscimento del tipo di immagine.

Seguendo una discussione ho fatto un echo di

$tipo = @addslashes($_FILES['imagefile']['type']);    

   echo $tipo."<br>";  

in firefox ho giustamente come risultato image/jpeg

con IE7 invece image/pjpeg

che mi manda in malora tutti i controlli, anche il resize delle immagini

che in pratica non vengono fatte se utilizzo IE7.

Ho aggiunto

$tipi_consentiti = array("image/gif","image/jpeg","image/png","image/pjpeg");

 tra i tipi consentiti adesso devo risolvere il problema nelle funzioni di resize

..
if ($t == 'image/jpeg'){$temp = @imagecreatefromjpeg($pic);}

vediamo se risolvo aggiungendo:

if ($t == 'image/pjpeg'){$temp = @imagecreatefromjpeg($pic);}

ciao

risposto 6 anni fa
frankphp
modificato 6 anni fa
X 0 X

Ho preso per i fondelli IE7  ;D ;D ;D ;D ;D ;D

ho aggiunto

$tipo = @addslashes($_FILES['imagefile']['type']);   
   
   if ($tipo == "image/pjpeg")
   {
      $tipo = "image/jpeg";
   } 
   
   echo $tipo."<br>"; 

e adesso funziona tutto.

Modificare le funzioni era un po' un casino così ho (ra)aggirato il problema.

Non so se è la soluzione ottimale (resto quindi in attesa di soluzioni più adeguate e professionali)..però finchè la barca va lasciamola andare  :P ..e vuoi mettere la soddisfazione di averglielo fatto ingoiare il rospo, diciamo così, a IE?!!?

Ciao e grazie

risposto 6 anni fa
frankphp
X 0 X

Mi sembra un'ottima soluzione e ti stavo anche per rispondere a questo:

ps: in ogni caso la faccenda è molto strana. Nemmeno un'idea buttata lì a caso?

Suggerendoti che forse IE modificava le caratteristiche del file. Una cosa che però mi sembrava assurda eppure è così.

Ottimo bravo!!!

risposto 6 anni fa
Mario Santagiuliana
X 0 X
Ottimo bravo!!!

Molte grazie Mario!!

Gli apprezzamenti di programmatori più bravi di me (e tu lo sei di gran lunga) mi fanno sempre

molto piacere e mi incoraggiano. Io mi diletto a fare qualche lavoretto in php e tra un progetto e un altro

passano il più delle volte parecchi mesi e non avendo una gran memoria mi tocca, ogni volta che voglio sviluppare qualcosa in php, ristudiare il linguaggio quasi da zero (forse ho esagerato, ma giusto per rendere l'idea).

In questi lunghi periodi, durante i quali non sono impegnato nello sviluppo di qualche lavoretto come dicevo,

ti confesso che mi capita di avere delle serie difficoltà a leggere degli script (se non adeguatamente commentati) da me stesso sviluppati un paio di anni addietro (figuriamoci quello degli altri!) :-[ :-[

Ciao.

risposto 6 anni fa
frankphp
X 0 X

Non sono un bravo programmatore php e nemmeno un esperto ;-)

Il codice è sempre bene commentarlo il più possibile a parer mio :-)

Ciao ciao  :bye:

risposto 6 anni fa
Mario Santagiuliana
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda