Lorsque l'on veut permettre le téléchargement d'un fichier .zip il suffit de faire un lien simple <A href="monfichier.zip"> Télécharger </A>, mais lorsqu'il s'agit d'un autre type, .txt par exemple, c'est une autre affaire... le navigateur l'ouvre et affiche son contenu... Alors comment faire pour le télécharger ou l'ouvrir avec MSWord ou MSExcel ? En précisant le "content-type" MIME dans l'en-tête de la page...
Les types MIME (Multi-purpose Internet Mail Extensions) sont une extension des types de données transportés par le protocole SMTP (Simple Mail Transfer Protocol) prévu à l'origine pour ne transférer que des fichiers textes mais qui, avec l'apparition du multimédia, a dû permettre l'échange de fichiers binaires (bureautique, images, sons, fichiers compressés).
Avec MIME, il est possible d'échanger des fichiers entre des machines quelconques (Unix, PC, MAC) : celle qui reçoit ces informations connait le type de fichier et peut l'associer à une application installée sur cette machine. Elle sera donc capable de présenter les données reçues de la façon la mieux adaptée :
vous recevez un son, la machine vous le joue ;
vous recevez une image, vous pouvez la visualiser ;
vous recevez un fichier HTML, vous pouvez le lire dans votre navigateur ;
vous recevez un fichier DOC, c'est MSWord qui l'ouvrira ;
Alors comment faire justement sur une page web pour tricher avec ce type MIME et décider que telle application doit ouvrir mon fichier d'extension quelconque ? En transmettant à l'en-tête de la page (Header), le "content-type" correspondant aux fichiers généralement ouverts par l'application que l'on veut lancer :)
' Dialogue de téléchargement response.contentType = "application/octet-stream" ' seulement pour application/octet-stream ! response.addHeader "Content-Disposition","attachment; filename=" & request("dwn")
' Ouvrir avec MSWord ' response.contentType = "application/msword" ' Ouvrir avec MSExcel ' response.contentType = "application/vnd.ms-excel" ' Ouvrir en Text ' response.contentType = "text/plain"
response.flush() ' Envoie le buffer
' Lecture du fichier set FSO = Server.CreateObject("Scripting.FileSystemObject") set inF = FSO.OpenTextFile(server.mapPath(request("dwn")),1,false) t = inF.readAll inf.close
response.write(t) ' Envoie le contenu du fichier
else%>
<A href="download.asp?dwn=download.asp">Test</A>
<%end if%>
download.php
<? if($_GET["dwn"]) {
// ob_clean(); // Vide le buffer (v >= 4.2)
// Dialogue de téléchargement header("content-type: application/octet-stream"); // seulement pour application/octet-stream ! header("Content-Disposition: attachment; filename=".$_GET["dwn"]);
// Ouvrir avec MSWord // header("content-type: application/msword"); // Ouvrir avec MSExcel // header("content-type: application/vnd.ms-excel"); // Ouvrir en Text // header("content-type: text/plain");
// voir aussi http://dev.nexen.net/scripts/details.php?scripts=354
flush(); // Envoie le buffer
readfile($_GET["dwn"]); // Envoie le fichier
} else { ?>
<A href="download.php?dwn=download.php">Test</A>
<? } ?>
download.aspx
<%@ import namespace="System.IO" %>
<script language="vb" runat="server">
Sub Page_Load(source As Object, e As EventArgs)
Dim dir As String = Request.MapPath(".") Dim f As String = Request.QueryString("dwn")
If f <> "" then
Response.Clear() ' Vide le buffer
' Dialogue de téléchargement Response.ContentType="application/octet-stream" ' seulement pour application/octet-stream ! Response.AddHeader("Content-Disposition","attachment; filename=" & f)
' Je n'ai pas encore réussi à le faire fonctionner avec d'autres types ' Si quelqu'un trouve comment...
' Ouvrir avec MSWord ' Response.ContentType = "application/msword" ' Ouvrir avec MSExcel ' Response.ContentType = "application/vnd.ms-excel" ' Ouvrir en Text ' Response.ContentType = "text/plain"
Response.Flush() ' Envoie le buffer
Response.WriteFile(dir & "\" & f) ' Envoie le contenu du fichier