Download de fichier [Résolu]

Sardonnen 89 Messages postés lundi 29 avril 2002Date d'inscription 6 décembre 2006 Dernière intervention - 7 févr. 2006 à 09:00 - Dernière réponse : Driche 1 Messages postés mardi 6 septembre 2005Date d'inscription 1 mars 2007 Dernière intervention
- 1 mars 2007 à 16:58
bonjour,
j'utilise asp.net V1 pour uploader mes fichiers sur le serveur mais je mets une clé numérique au début du nom du fichier avant de le sauvegarder sur le serveur (cela permet par exemple de sauvegarder des fichiers différents avec le même nom). Par contre je souhaiterais forcer l'affichage la boite de dialogue pour ouvrir ou enregistrer le fichier et forcer le nom du fichier si l'utisateur souhaite l'enregistrer, j'ai cherché des sources mais sans succès, comment dois je faire????

Voici mon code pour faire mes upload :

Dim savePath As String = "c:\www\upload"
Sub Upload_Click(sender As Object, e As System.Web.UI.ImageClickEventArgs)
If Not (ul_file.PostedFile Is Nothing) Then
Try
Dim postedFile = ul_file.PostedFile
Dim filename As String = Path.GetFileName(postedFile.FileName)
Dim contentType As String = postedFile.ContentType
Dim contentLength As Integer = postedFile.ContentLength


dim r_ident_file as string
r_ident_file= ' valeur incrementée

postedFile.SaveAs(savePath & r_ident_file & "_" & filename)
message.Text = postedFile.Filename & " uploaded" & _
"
content type: " & contentType & _
"
content length: " & contentLength.ToString()


End Try
End If
End Sub
Afficher la suite 

11 réponses

Répondre au sujet
jesusonline 6827 Messages postés dimanche 15 décembre 2002Date d'inscription 13 octobre 2010 Dernière intervention - 7 févr. 2006 à 15:35
+3
Utile
j'ai pas le temps sinon je vais etre en retard mais :

<%@ Page Language= "VB" ContentType="text/html" ResponseEncoding="iso-8859-1" %>
<%@ import namespace="System.IO" %>
<script language="vb" runat="server">


Sub Page_Load(source As Object, e As EventArgs)


Dim dir As String = Request.MapPath("upload")
Dim id As String = request.querystring("id")
If id <> "" 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= " & id.substring(3))


Response.Flush() ' Envoie le buffer


Response.WriteFile(dir & "" & id ) ' Envoie le contenu du fichier


End If


End Sub


</script>

libre à toi de modifier le fileName ;)


<HR>
Cyril - MVS - =70-305 MCP ASP<
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de jesusonline
jesusonline 6827 Messages postés dimanche 15 décembre 2002Date d'inscription 13 octobre 2010 Dernière intervention - 7 févr. 2006 à 12:00
0
Utile
Bonjour,

il faut mettre un content type spécial

System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" & id & "." & oFichier.Extension)
Response.ContentType = "application/octet-stream"


<HR>
Cyril - MVS - MCP ASP<
Commenter la réponse de jesusonline
Sardonnen 89 Messages postés lundi 29 avril 2002Date d'inscription 6 décembre 2006 Dernière intervention - 7 févr. 2006 à 13:18
0
Utile
mais dans ce cas là tu es donc obligé de passer par une page intermédiaire qui va te demander d'ouvrir ou enregistrer, ok
mais pour spécifier un nom dans la boite de dialogue enregistrer qui est différent du nom réél sur le serveur, tu procedes comment????
Commenter la réponse de Sardonnen
jesusonline 6827 Messages postés dimanche 15 décembre 2002Date d'inscription 13 octobre 2010 Dernière intervention - 7 févr. 2006 à 13:34
0
Utile
Je ne comprend pas !

Ce que je t'ai mis ca sert à

tu as un fichier stocké dans une bdd (ou autre) tu veux que l'utilisateur telecharge ce fichier

par exemple tu as

http://localhost/recupFile.aspx?id=344

dans cette page tu récuperes ton stream tu l'affiches avec response.binarywrite (ou un truc du genre) mais le pb c'est que si c'est une image alors le navigateur va l'afficher plutot que de la proposer en telechargement ...

Si tu rajoutes ce content-type (le bout de code du dessus) ca va faire forcer au navigateur à proposer en telechargement le fichier

Mais aprés relecture de la question je ne suis pas sur que c'est ce que tu voulais ?


<HR>
Cyril - MVS - MCP ASP<
Commenter la réponse de jesusonline
Sardonnen 89 Messages postés lundi 29 avril 2002Date d'inscription 6 décembre 2006 Dernière intervention - 7 févr. 2006 à 13:52
0
Utile
si c'est la premier element de reponse que je souhaitais mais ensuite mon nom de fichier sur le serveur va etre 34_test.txt et j'aimerais forcer le nom de fichier dans la boite de dialogue à test.txt, est ce que ça c'est possible???

merci en tout cas pour forcer l'affichage de la boite de dialogue.
Commenter la réponse de Sardonnen
jesusonline 6827 Messages postés dimanche 15 décembre 2002Date d'inscription 13 octobre 2010 Dernière intervention - 7 févr. 2006 à 14:03
0
Utile
Je pense que ca doit etre possible

si tu modifies cette ligne :

System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" & id & "." & oFichier.Extension)

tu vois que tu peux modifier le champ fileName, pour cela il faudra bien sur que tu fasses une page aspx (ou un handler) qui permettra d'envoyer le fichier genre FileById.aspx?id=toto.txt cette page recuperera 34_toto.txt enverra son contenu via response.binarywrite et il te faudra alors setter le bon content type ainsi que le content-disposition :)


<HR>
Cyril - MVS - MCP ASP
Commenter la réponse de jesusonline
Sardonnen 89 Messages postés lundi 29 avril 2002Date d'inscription 6 décembre 2006 Dernière intervention - 7 févr. 2006 à 14:20
0
Utile
si j'ai bien compris à travers le content-type et content-disposition tu spécifies le nom réél du fichier sur le serveur avec son application associé. A quel moment ou bien a quel endroit tu lui spécifie que le fichier 34_toto.txt sur le serveur tu veux qu'il soit afficher pour l'utilisateur du genre enregistrer le fichier toto.txt???
parce qu'avec FileById.aspx?id=34_toto.txt, tu spécifies le fichier impacté par la boite de dialogue ouvrir ou enregistrer, pour le moment on ne spécifie pas le libellé présent dans la boite de dialogue enregistrer sous au niveau du nom du fichier. hors moi à la limite je souhaiterais forcer le nom du fichier dans la boite de dialogue à tata.txt.

je ne sais pas si je suis bien clair????
Commenter la réponse de Sardonnen
jesusonline 6827 Messages postés dimanche 15 décembre 2002Date d'inscription 13 octobre 2010 Dernière intervention - 7 févr. 2006 à 14:43
0
Utile
Quand tu vas sur FileByID.aspx?id= 34_toto.txt

enf ait dans le page_load tu passes à la moulinette l'id (je te conseil de pas mettre le nom du fichier mais autre chose) tu lui envoie via un response.writeFile ou response.binaryWrite le fichier qu'il veut ensuite tu peux encore jouer sur les en tetes http pour cela tu spécifie

System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename= toto.txt ");
Response.ContentType = "application/octet-stream";
Response.AddHeader(<VAR>"Content-Length"</VAR>, (int)tailleDuFichier);

:) je pense que ca répond à ta question ?


<HR>
Cyril - MVS - MCP ASP
Commenter la réponse de jesusonline
Sardonnen 89 Messages postés lundi 29 avril 2002Date d'inscription 6 décembre 2006 Dernière intervention - 7 févr. 2006 à 15:22
0
Utile
et quand je fais

System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename= toto.txt ");

le code sait qu'il doit aller le fichier 34_toto.txt???
car pour moi je comprenais que le fichier allait chercher sur le serveur un fichier qui se nomme toto.txt. Tu vois c'est là que je ne vois pas l'intêret de ton id???

FileByID.aspx?id =34_toto.txt



<%@ Page Language= "VB" ContentType="text/html" ResponseEncoding="iso-8859-1" %>
<%@ import namespace="System.IO" %>


<script language="vb" runat="server">


Sub Page_Load(source As Object, e As EventArgs)


Dim dir As String = Request.MapPath("upload")
Dim id As String = request.querystring("id")
If id <> "" 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=" & id)


Response.Flush() ' Envoie le buffer


Response.WriteFile(dir & "" & id ) ' Envoie le contenu du fichier


End If


End Sub


</script>

car avec ce code j'obtiens bien une boite de dialogue mais le nom de fichier qui apparait dans la boite de dialogue est 34_toto.txt
Commenter la réponse de Sardonnen
Sardonnen 89 Messages postés lundi 29 avril 2002Date d'inscription 6 décembre 2006 Dernière intervention - 7 févr. 2006 à 15:40
0
Utile
ok super génial
je n'avais pas compris que c'etait le response.write qui ouvrait le fichier avec le nom réél présent sur le serveur et que le
Response.AddHeader("Content-Disposition","attachment; filename=" & id.substring(3))
te permettait de spécifier le nom de fichier que tu souhaites.

super cool!!!!
je te remercie Cyril pour ta patience et tes explications.
a+
Commenter la réponse de Sardonnen
Driche 1 Messages postés mardi 6 septembre 2005Date d'inscription 1 mars 2007 Dernière intervention - 1 mars 2007 à 16:58
0
Utile
Bonjour à tous les deux,

Tout d'abord bravo Cyril pour tes posts, débutant en ASP.NET ils m'ont bien aidé.
J'ai une application ASP.NET (code behind C#) dans laquelle j'ai intégré ton code pour le téléchargement de fichiers, mais j'ai un problème d'accents dans la boîte de dialogue de téléchargement. Les noms de fichiers semblent apparaitre en code page windows-1252 (Europe occidentale sous IE) alors que je voudrais les afficher en UTF-8.

J'ai essayé d'ajouter les lignes suivantes :

Response.Charset =

"UTF-8";
Response.ContentEncoding = System.Text.
Encoding.UTF8;
Response.HeaderEncoding = System.Text.
Encoding.UTF8;
Mais rien à faire, ça ne marche toujours pas !

Deuxième point :

Mon application contient une partie client Windows Form qui permet de stocker des documents dans une base SQL Server Express. Le contenu de ces documents est stocké dans un champ type "image" (champ binaire). J'ai un bout de code qui permet de récupérer le contenu et de reconstruire ces fichiers.
La partie ASP.NET permet à des utilisateurs de récupérer aussi ces fichiers (d'où le code de téléchargement).

Lorsque je stocke des fichiers pdf et que je les récupère avec l'appli windows j'arrive à les lire avec Adobe Reader 7, mais lorsque je les récupère en les téléchargeant sur le site, il est alors impossible de les lire avec cette même version d'Adobe Reader. Je me prends un message d'erreur disant que le fichier doit être endommagé. Mais la version 8, arrive à les ouvrir.

Une petite idée sur ces deux problèmes ?

Merci d'avance

Driche
Commenter la réponse de Driche

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.