Validation sur download forcée (header http)

mortiis Messages postés 120 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 9 mars 2008 - 14 oct. 2004 à 09:11
cs_nlh Messages postés 93 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 9 décembre 2007 - 16 oct. 2004 à 22:52
Bonjour à tous

J'ai un script qui fait un download forcé sur un fichier zip.
En fait ce script génère un fichier zip selon les fichiers que l'utilisateur à sélectionné et ensuite envoi le zip par download forcé et finalement supprime le fichier zip.

Tout sa fonctionne à merveille.

Le problèmme est que si l'utilisateur à sélectionner pour 100 mo de fichier sa prend un bon 30 seconde avant que mon script`ait eu le temps de faire le zip. Alors si pendent ce temps, le client ferme le browser, mon script continu à tourner et le fichier zip se créé quand même, par contre, l'envoi ne s'effectu pas puisque le client est fermé, ce qui a pour effet que le script arrête et que le fichier zip ne se supprime pas.

Il peut y avoir un autre problèmme qui est que si l'utilisateur appuy sur le bouton annuler de la boite d'enregistrement du fichier, le script arrête aussi de tourner et ne se rend pas non plus au code qui supprime le fichier zip temporaire.

Alors ce que je voudrait faire c'est valider si l'utilisateur appuy sur la touche annuler pour pouvoir faire un unlink sur le zip.
Est-ce possible ? je sait que sa se fait avec la fenêtre d'identification.

En un deuxième temps pour savoir si la fenêtre est fermée avant de commencer le download.
Je sait pas si sa se fait, mais p-e en envoyant une entete http avec header ?
J'avait pense a onunload de html avec du javascript, mais le problèmme c'est que la fenêtre est vide puisque c'est un download automatique et qu'on ne peut pas écrire dans la fenêtre sinon sa marche pas.

Bon je crois que le problèmme est bien illustré et ce que je cherche aussi. Je serait bien content d'avoir une solution qui fonctionne, car j'ai épuiser toutes mes ressources et toutes mes idées aussi farfelues les unes que les autres.

Alors toutes les suggestions moindrement sensées sont les bienvenue

Merci beaucoup pour le temps.

7 réponses

cs_nlh Messages postés 93 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 9 décembre 2007 1
16 oct. 2004 à 15:52
alors pour le premier probleme... il faut que le script s'arrete quand le client ferme la fenetre :

si c'est ton propre serveur je te conseille de le configurer pour arreter l'execution du script si le client a fermer la fenetre (ignore_user_abort dans le fichier php.ini), afin de ne pas le faire bosser pour rien dans le cas d'un gros fichier.
ou/et de mettre ca dans ton php.

//quand le script se ferme
//on exectute la fonction shutdown
register_shutdown_function("shutdown"); 
//voila la fonction shutdown
function shutdown(){
//elle verifie de quelle facon c'est couper le script
//si c'est le client qui a coupé le script alors
                   if(connection_status()=="1"){
//on supprime le fichier qui vien de se creer
                         supprimer le fichier 
                   }

                }


sinon j'ai pas bien compris comment tu supprimais tes fichiers ducoup j'ai pas compris tres bien les problemes suivants. mais a vue de nez je pense que tu peux en resoudre pas mal rien qu'avec ca...

Emailing-Online est en cour de réalisation, mais vous pouvez quand meme regarder et tester.
0
mortiis Messages postés 120 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 9 mars 2008
16 oct. 2004 à 17:09
Bonjour à tous

Ce que tu vient de me donner comme code est fantastique je cherchait sa depuis longtemps j'étais sur le bord d'une dépression.

Merci beaucoup, je vais tester sa tout de suite.
0
mortiis Messages postés 120 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 9 mars 2008
16 oct. 2004 à 18:00
Bonjour à tous

Bon finalement j'ai tester ta solution et je n'ai pas eu de récultats.
Voici ce que j'ai fait :

//Enlève la limite de 30 secondes
set_time_limit(0);
print("\n");
ignore_user_abort(false);
register_shutdown_function("shutdown_m");
function shutdown_m()
{
print("\n");
if(connection_aborted())
{

if(is_file("path_fichier.extention"))
unlink("path_fichier.extention");
exit;
}
}

j'ai aussi essayer la même chose avec :
ignore_user_abort(true);

Et j'ai aussi essayer simplement de mettre à la fin de mon script :

print("\n");
if(connection_aborted())
{

if(is_file("path_fichier.extention"))
unlink("path_fichier.extention");
exit;
}

Et rien de tout sa fonctionne. Est- qu'il y aurait des config a faire dans httpd.conf ou dans php.ini ou dans my.ini ?

Si oui j'aimerais bien savoir lesquel

Merci encore.
0
cs_nlh Messages postés 93 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 9 décembre 2007 1
16 oct. 2004 à 20:36
ignore_user_abort(false);
ca ca ne sert a rien... c'est dans le php.ini qu'il faut changer ca... mais c'est optionnel, t'embete pas avec ca...

if(connection_aborted())
cette fonction ne marche plus depuis la version 3 je crois... sert toi de celle que je t'ai donné connection_status(), si elle retourne 1 c'est que le client a fermer ca fenetre

sinon la deuxieme methode c'est pas la bonne dutout :les fonction connection_aborted() ou connection_status() ne fonctionnent que lorsque le script est terminé. donc cette fonction ne sert que dans un truc du genre register_shutdown_function

pi voila..

Emailing-Online est en cour de réalisation, mais vous pouvez quand meme regarder et tester.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mortiis Messages postés 120 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 9 mars 2008
16 oct. 2004 à 22:37
Bonjour à tous

J'ai réessayer :

register_shutdown_function("shutdown");
//voila la fonction shutdown
function shutdown()
{
mkdir("k://" . connection_status());
if(connection_status() == 1)
{
mkdir("k://del");
}

}

J'ai aussi essayer avec le "1" comme dans ton exemple

j'ai aussi essayer avec et sans :
ignore_user_abort

Et j'ai toujours le même résultat connection_status() vaut toujours 0.
La fonction shutdown est appelé, mais toujours après que le script ait fini l'exécution.
Même si le client ferme le browser le script continu à s'exécuté et à la fin je recoit toujours connection_status() == 0

Alors je commence à croire que soit ce script ne fonctionne pas, soit il faut configurer qqc dans php.ini ou dans httpd.conf

Aurait tu une solution.
0
cs_nlh Messages postés 93 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 9 décembre 2007 1
16 oct. 2004 à 22:50
ce qui est sure c'est que la fonction va forcement s'executer a la fin du script... mais ca a la rigueur c'est pas vraiment grave le but c'est que tu puisse réagir en fonction de l'action de l'utilisateur... si tu veux qu'il se ferme au moment de la fermeture du browser va changer la ligne ignore_user_abort dans le php.ini.. c'est tout ce que je sais...
pour ce qui est du connection_status qui reste a "0", je ne sais pas pourquoi... normalement ca veux dire que le script s'est executer normalement, et que ni time_out, ni fermeture du browser ont pertubé le script.
donc j'en deduis soit que le scripte s'est executé correctement
soit que cette fonction ne marche pas sur ton serveur..
pour tester configure le time_out à 1 sec

ini_set('pfpro.defaulttimeout',"100000");
ini_set('max_execution_time',"100000");

et regarde si connection_status() == 2.. dans ce cas ca veut dire que la fonction marche...
désolé que ca ne fonctionne pas chez toi.... chez moi c'est impec.. je sais pas quoi te dire...

Emailing-Online est en cour de réalisation, mais vous pouvez quand meme regarder et tester.
0
cs_nlh Messages postés 93 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 9 décembre 2007 1
16 oct. 2004 à 22:52
oups pardon... c'est :
ini_set('pfpro.defaulttimeout',"1");
ini_set('max_execution_time',"1");

pour mettre le time out a 1sec dsl ;)

Emailing-Online est en cour de réalisation, mais vous pouvez quand meme regarder et tester.
0
Rejoignez-nous