IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

Télécharger plusieurs fois une image sans avoir de problème de cache


Sujet :

Web & réseau Delphi

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut Télécharger plusieurs fois une image sans avoir de problème de cache
    salut

    je cherche à télécharger une image à plusieurs intervalles, seulement je n'aimerais pas que mon idhttp garde en cache l'ancien fichier

    pour éviter un téléchargement inutile, je procède comme suit :

    - si fichier n'existe pas on télécharge
    - s'il existe, récupération de son md5 et le comparer avec celui se trouvant sur notre pc
    - si identique affiche l'image
    - sinon on efface celui de notre Hd pour télécharger le nouveau

    je télécharge ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var
    F : string;
    Fs:TFileStream;
    begin
       F:='http://mon_site/fichier.jpeg';
       FS := TFileStream.Create('fichier.jpeg',fmCreate);
       idHTTP.Get(F,Fs);
       Fs.Free;
    end;
    j'ai déjà fais des requête http presque dans le même genre (variable Get qui nous sort un résultat différent) et malgré tout par moment le résultat était l'ancien fichier

    on m'avais conseillé ici d'ajouter une autre variable Get qui sera aléatoire à chaque fois

    ça marchait bien, là ... ce n'est pas un fichier php et un Get au bout ... donc que pensez vous qu'il faudrait faire ?

    merci d'avance

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    409
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 409
    Par défaut
    avant de télécharger ton image avec get utilise head pour juste avoir l'en-tête et regarde la date de dernière modification

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var DateFile : TDateTime
    ...
    idHttp.Head(Url);
    DateFile := idHttp.Response.LastModified;

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    Citation Envoyé par exoseven Voir le message
    avant de télécharger ton image avec get utilise head pour juste avoir l'en-tête et regarde la date de dernière modification

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var DateFile : TDateTime
    ...
    idHttp.Head(Url);
    DateFile := idHttp.Response.LastModified;
    salut

    merci pour ton idée, ça m'évite de faire une requête pour récupérer le MD5

    par contre, ça ne répond pas à mon problème

    mon problème n'est pas de savoir si le fichier du serveur est plus récent ou non, c'est de forcé le téléchargement réel du fichier

    pourquoi je dis réel, car souvent le fichier n'est pas téléchargé à chaque fois ... parfois le fichier est gardé en cache j'ai l'impression et donc je sais que le fichier est obsolète, mais comment je peux obliger à télécharger le nouveau ?

    lorsque je fais une requête avec un fichier php j'ajoute juste un nombre au hasard, ainsi l'url est toujours différente, mais ici je ne peux pas ajouter de paramètre ?

    à moins qu'avec ton idée le composant sait qu'il n'a pas encore téléchargé le fichier, et donc ce serait géniale ^^ ?

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 924
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 924
    Par défaut
    Citation Envoyé par Coussati Voir le message
    lorsque je fais une requête avec un fichier php j'ajoute juste un nombre au hasard, ainsi l'url est toujours différente, mais ici je ne peux pas ajouter de paramètre ?
    Et pourquoi pas

    Sinon, tu peux essayer d'ajouter IdHTTP1.Request.Pragma := 'no-cache';

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Et pourquoi pas

    Sinon, tu peux essayer d'ajouter IdHTTP1.Request.Pragma := 'no-cache';
    tu penses qu'on peux ajouter un string variable à l'url ?

    dis moi comment parce que ça plante chez moi (en même temps logique non ?)

    http://mon_site/mon_image.jpeg 12546

    sinon j'ai trouvé sur un site l'astuce du 'no-cache' mais sur d'autres sites les utilisateurs disent que ça ne fonctionnent pas tout le temps

    le truc c'est qu'il faut que je test sur une durée pour savoir ce qu'il en est, mais si quelqu'un avait la réponse sûr ça m'arrangerais ...

    ils en parlent là :

    http://www.delphigroups.info/2/1/508248.html

    http://www.delphigroups.info/2/12/486731.html

    et là une personne dit que ça ne fonctionne pas :

    http://www.devsuperpage.com/search/A...sp?ArtID=56105

    j'étais content

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    c'est un faux problème TidHTTP n'utilise aucun cache, il envoie toujours la requête au serveur et renvoie toujours la nouvelle réponse du serveur, si l'image n'a pas été mise à jour c'est le serveur qui utilise un cache (ou un Proxy entre les deux) mais pas Indy.

    pour l'histoire du paramètre supplémentaire il suffit d'utiliser un mini script PHP getimage.php?name=image.jpg qui faire un readfile($name) EN FAISANT ATTENTION QUE LE PARAMETRE "name" SOIT BIEN UNE IMAGE AUTORISEE !!! sinon il permettrait de récupérer n'importe quel fichier sur le serveur, y compris un .PHP !

    et sur ce script tu peux ajouter autant de paramètres que tu veux pour forcer le rechargement de l'URL, un '&time=' + IntToStr(GetTickCount) suffira
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    c'est un faux problème TidHTTP n'utilise aucun cache, il envoie toujours la requête au serveur et renvoie toujours la nouvelle réponse du serveur, si l'image n'a pas été mise à jour c'est le serveur qui utilise un cache (ou un Proxy entre les deux) mais pas Indy.

    pour l'histoire du paramètre supplémentaire il suffit d'utiliser un mini script PHP getimage.php?name=image.jpg qui faire un readfile($name) EN FAISANT ATTENTION QUE LE PARAMETRE "name" SOIT BIEN UNE IMAGE AUTORISEE !!! sinon il permettrait de récupérer n'importe quel fichier sur le serveur, y compris un .PHP !

    et sur ce script tu peux ajouter autant de paramètres que tu veux pour forcer le rechargement de l'URL, un '&time=' + IntToStr(GetTickCount) suffira
    salut PAUL, j'espérais que tu participes à mon topic, comme toujours ton aide est précieuse

    je suppose que c'est un peu ce qu'avait Andnotor en tête, mais je ne savais pas comment m'y prendre ...

    je viens de tester et ça fonctionne bien, je pourrai donc mettre une variable différente à volonté

    par contre, ayant peu d'expérience dans cette pratique, je n'avais pas penser à la sécurité ! cependant je pense que sans le savoir j'étais quand même protégé :

    - mon script récupère le nom du fichier (sans l’extension)

    - il ajoute (depuis le serveur) le chemin complet car le script et les images ne sont pas dans le même répertoire, et donc si un utilisateur mal veillant décide de me piquer mot_de_passe.php verra le chemin renommer en /image/mot_de_passe.php

    [après_réflexion]je pense qu'il peut toujours envoyer "../mot_de_passe.php" pour se déplacer[/] mais là encore faudrait il qu'il sache ce qui a sur le serveur pour piquer ?

    - une recherche s'effectue (if fileexist) pour trouver l'extension du fichier avec uniquement comme test : .jpg / .jpeg / .png / .gif (les formats disponibles)

    est ce suffisant selon vous ? (je pense que le 3/ sera efficace)

    merci encore ça fait plaisir, moi qui pensais me remettre qu'au "no-cache"

  8. #8
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    oui ça devrait fonctionner.

    quelques autres solutions:

    interdire le ".." dans le nom (str_pos)

    utiliser un numéro d'image au lieu d'un nom, $img = (int)$_GET['img']; $file = $files[$img]; // où $files est un tableau de noms d'image

    etc...
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    oui ça devrait fonctionner.

    quelques autres solutions:

    interdire le ".." dans le nom (str_pos)

    utiliser un numéro d'image au lieu d'un nom, $img = (int)$_GET['img']; $file = $files[$img]; // où $files est un tableau de noms d'image

    etc...
    oui c'est une option intéressant de retirer les .. ou les slash

    merci en tout cas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/06/2015, 15h48
  2. [PHP 5.2] Télécharger une image sans passer par un fichier
    Par grunk dans le forum Langage
    Réponses: 4
    Dernier message: 04/04/2012, 11h24
  3. Changer plusieurs fois une image dans une méthode
    Par Belinformatic dans le forum GTK+ avec Python
    Réponses: 1
    Dernier message: 25/02/2011, 09h29
  4. Réponses: 9
    Dernier message: 13/09/2006, 14h19
  5. Afficher une image sans passer par les textures
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/05/2003, 19h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo