2009-12-22 4 views
2

J'ai donc écrit une galerie d'images avec une option pour télécharger l'image originale (par défaut, elle affiche une version redimensionnée de l'image). J'aimerais savoir comment jeComment puis-je forcer les utilisateurs à télécharger l'image (comme le téléchargement de pdf)?

Le code suivant va forcer les utilisateurs à enregistrer le pdf plutôt que de le voir avec le navigateur, j'aimerais obtenir le même effet pour les images (jpg, gif, png) en liant le clic action avec jQuery, comment vais-je être capable de faire cela?

Taken de php.net

<?php 
// We'll be outputting a PDF 
header('Content-type: application/pdf'); 

// It will be called downloaded.pdf 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 

// The PDF source is in original.pdf 
readfile('original.pdf'); 
?> 

html:

<div class="download"> 
<a href="http://www.xyz/abc.jpg"> 
    Download original image</a> 
</div> 

js:

$(".download").click(function(){ 
    // call a php to download the image 
}); 

Est-il possible de le faire?

Éditer: Que faire en code javascript?

Répondre

3

C'est possible. Le serveur (script PHP) doit envoyer l'en-tête Content-Disposition comme indiqué dans votre premier extrait. Par exemple:

header('Content-Disposition: attachment; filename="abc.jpg"'); 
+0

Merci pour votre réponse rapide. Je viens de mettre à jour ma question. Je veux savoir sur le code javascript, pas PHP. – John

+0

Si vous appelez une page PHP pour servir l'image, qu'est-ce qui ne va pas avec PHP? –

+0

Mais cela échoue sur IE lorsque vous avez des caractères spéciaux dans le nom de fichier. Et @Alix Axel: WTF êtes-vous en train de booster? – Frunsi

1

Généralement, la décision d'affichage ou de téléchargement est prise par le navigateur en fonction du type MIME. Je pense que c'est ce que vous voulez:

Si vous voulez juste pour forcer un téléchargement utiliser la fonction header() pour définir le Content-type à application/octet-stream.

Le support de type MIME d'Internet Explorer est rompu, il ne réagit donc pas à ci-dessus. Toutefois, si vous ajoutez à l'en-tête Content-Disposition, vous pouvez également forcer MSIE 5 à télécharger le fichier .

Cet en-tête vous permet également de spécifier un nom de fichier. Cela fonctionne dans les deux Netscape et MSIE 5.

header ("Content-Disposition: pièce jointe ; filename = \" myfile.abc \ "");

Edit: voici quelques informations intéressantes, mais il ne peut pas être pertinent à votre cas d'utilisation spécifique:

Ce problème se produit si les conditions suivantes sont remplies:

Le nom du fichier dans l'en-tête de contenu utilise des caractères codés sur deux octets (DBCS), tels que en tant que caractères japonais. Le second octet , ou "trailbyte", de l'un des caractères DBCS contient des valeurs qui représentent le système de fichiers réservés en ASCII. Par exemple, le "trailbyte" contient des valeurs qui représentent des valeurs ASCII telles que 0x5c ou 0x7c.

Edit 2: Si vous êtes uniquement intéressé à faire cela sur le client, qui a répondu ici: Force Mime Type in Browser (with Javascript)

+0

Je devrais préciser que je n'ai pas besoin de prendre en charge IE 6 ou moins, est-ce que la déclaration ci-dessus s'applique à IE 7 +? – John

+0

Je crois que cela n'a pas changé - laissez-moi savoir si cela ne fonctionne pas pour vous – danben

2

Il est possible, mais IE (quelle surprise ...) a un bug subtil :

<?php 
header('Content-Type: ' . $your_content_type . '; charset=UTF-8'); 
if(strpos($_SERVER['HTTP_USER_AGENT'],'MSIE') !== false) header('Content-Disposition: attachment; filename="'.rawurlencode($your_filename).'"'); 
else header('Content-Disposition: attachment; filename="'.addslashes($your_filename).'"'); 
?> 

EDIT: Il n'y a plus rien à faire en javascript! Laissez simplement l'utilisateur cliquer sur l'URL de l'image, ou simplement ajouter un gestionnaire de clic, qui envoie le navigateur à l'URL de l'image! Du côté client/navigateur, vous ne pouvez pas décider si une URL doit être téléchargée ou affichée!

Questions connexes