2009-05-12 5 views
1

J'utilise l'approche this pour afficher une icône près de chaque lien vers un fichier de mon application Web.icônes de type de fichier en utilisant une règle css

Afin d'éviter les problèmes de cache d'historique IE, j'affiche un lien en tant que

<a href="path/to/the/file.xls?timestamp=0234562">FileName.xls</a>.
Dans ce cas, la règle CSS ne fait pas son travail. Savez-vous comment je peux résoudre ce problème?

+1

Quelle règle utilisez-vous? – Gumbo

Répondre

4

Le sélecteur a[href$='.xls'] que vous utilisez probablement s'applique uniquement s'il correspond à la fin de la valeur de HREF. Utilisez a[href*=.xls] à la place.

Extrait de Selectors Level 3:

[att*=val] 

représente un élément avec l'attribut dont la valeur att contient au moins une instance de la sous-chaîne "val". Si "val" est la chaîne vide alors le sélecteur ne représente rien .

Modifier

Si vous avez le contrôle sur le fichier .htaccess, vous pouvez assurer là pour éviter les problèmes de cache, de sorte que vous pouvez utiliser vos règles de feuille de style d'origine. Voir Cache-Control Headers using Apache and .htaccess pour plus de détails.

+2

Mais cela correspondrait aussi à "fichier.xls.zip", et je ne pense pas que leurs icônes seraient les mêmes ... – Seb

+1

@Seb Dans ce cas, vous pouvez écrire 'href * =. Xls?'. –

+0

@Torok: non, car cela correspondrait à n'importe quelle chaîne _containing_ ".xls", comme l'exemple que j'ai donné. – Seb

1

Le problème est que a[href$='.xls'] correspond à la fin de l'attribut href de votre ancre, mais vous ajoutez l'horodatage, donc la fin de ce href est en fait l'horodatage.

Pour éviter les problèmes de mise en cache, vous pouvez gérer les téléchargements à l'aide d'un proxy; c'est-à-dire, utilisez un script qui déclenche le téléchargement de fichiers. En PHP, il est facilement accomplised avec la fonction readfile() et l'envoi de no-cache en-têtes, par exemple:

<a href="download.php?file=spreadsheet.xls">spreadsheet.xls</a> 

Mais depuis que je ne sais pas quel langage de programmation que vous utilisez, je ne pouvais pas dire beaucoup plus.

+0

J'utilise php. Pouvez-vous expliquer votre approche? –

0

Duncan, je sais que cela a déjà été répondu, mais juste pour votre commentaire, voici une fonction qui devrait fonctionner pour vous. Je pense que c'est presque directement le manuel de PHP ou d'autres exemples quelque part. Je l'ai dans une classe qui gère d'autres choses comme la vérification des autorisations de fichiers, les téléchargements, etc. Modifier selon vos besoins.

public function downloadFile($filename) 
{ 

    // $this->dir is obviously the place where you've got your files 
    $filepath = $this->dir . '/' . $filename; 
    // make sure file exists 
    if(!is_file($filepath)) 
    { 
     header('HTTP/1.0 404 Not Found'); 
     return 0; 
    } 
    $fsize=filesize($filepath); 

    //set mime-type 
    $mimetype = ''; 
    // mime type is not set, get from server settings 
    if (function_exists('finfo_file')) 
    { 
     $finfo = finfo_open(FILEINFO_MIME); // return mime type 
     $mimetype = finfo_file($finfo, $filepath); 
     finfo_close($finfo); 
    } 
    if ($mimetype == '') 
    { 
     $mimetype = "application/force-download"; 
    } 

    // replace some characters so the downloaded filename is cool 
    $fname = preg_replace('/\//', '', $filename); 
    // set headers 
    header("Pragma: public"); 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: public"); 
    header("Content-Description: File Transfer"); 
    header("Content-Type: $mimetype"); 
    header("Content-Disposition: attachment; filename=\"$fname\""); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: " . $fsize); 

    // download 
    $file = @fopen($filepath,"rb"); 
    if ($file) 
    { 
     while(!feof($file)) 
     { 
      print(fread($file, 1024*8)); 
      flush(); 
      if (connection_status()!=0) 
      { 
       @fclose($file); 
       die(); // not so sure if this best... :P 
      } 
     } 
     @fclose($file); 
    } 
} 
Questions connexes