string strCsharp = "var str_loc = \"ViewFiles.asp?\";";
Il faut que tu échappes les guillemets dans ta chaîne.
Version imprimable
string strCsharp = "var str_loc = \"ViewFiles.asp?\";";
Il faut que tu échappes les guillemets dans ta chaîne.
merci j'y avais pas pensé !:mouarf:
tu perds du temps.Citation:
Pour l'histoire de la Popup, après quelques recherches google, je suis tombé sur plusieurs possibilités, qu'il faut que je test...
ce que tu veux faire, à savoir forcer le téléchargement d'un fichier à l'insu de l'utilisateur, c'est IMPOSSIBLE. ca serait une énorme faille de sécurité
Forcer le téléchargement c'est certain, mais ouvrir une popup sur une page dont on a changé les headers ca l'est (possible). Je le fais pour des fichiers csv, que je charge ainsi directement dans de l'excel.
Par contre, je ne sais aps si ce procédé est réutilisable avec d'autres données. J'avoue n'avoir jamais essayé..
oui, c'est possible avec tout type de fichier. d'ailleurs, pour cela, il est conseillé d'utiliser un ashx.
ca va simplement automatiquement ouvrir la boite de téléchargement. Enfin ca dépend de la configuration du poste. par exemple, un pdf s'ouvrira directement dans le navigateur de certains et se téléchargera pour d'autres.
généralement, ce cas est utilisé lorsque l'on stocke des documents en base. Il est donc conseillé de stocker:
nom du fichier (avec extension)
type mime
dans le cas où l'on ne stocke pas les fichiers en base, il faut passer par un switch et bien connaitre les extensions autorisées.
ca donne le code suivant
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 /// <summary> /// Loads the file. /// </summary> /// <param name="id">The id.</param> private void LoadFile(int id) { //todo: mettre une gestion d'erreur et ou le message d'erreur qu'il convient DocumentManager docManager = new DocumentManager(); Document doc = docManager.Select(id); if (doc != null) { docManager.UpdateCount(doc.ID); this.SendFileToBrowser(doc); } } /// <summary> /// Sends a file to the user's browser (instead of the page) /// </summary> /// <param name="doc">The doc.</param> protected void SendFileToBrowser(Document doc) { if (String.IsNullOrEmpty(doc.HTTP)) { string extension = doc.Extension; string contentTypeHeader; switch (extension) { case "doc": contentTypeHeader = "application/msword"; break; case "xls": contentTypeHeader = "application/vnd.ms-excel"; break; case "ppt": contentTypeHeader = "application/vnd.ms-powerpoint"; break; case "pdf": contentTypeHeader = "application/pdf"; break; case "jpeg": case "jpg": contentTypeHeader = "image/jpeg"; break; case "txt": contentTypeHeader = "text/plain"; break; case "avi": contentTypeHeader = "video/avi"; break; default: contentTypeHeader = "application/octet-stream"; break; } this.Response.Clear(); this.Response.ClearHeaders(); this.Response.Cache.SetCacheability(HttpCacheability.Private); // réactivation du cache client pour cette réponse! (override le web.config) Response.AddHeader("Content-Length", doc.Content.Length.ToString()); this.Response.ContentEncoding = Encoding.GetEncoding("iso-8859-1"); this.Response.AddHeader("content-disposition", "attachment; filename=\"" + HttpUtility.UrlEncode(doc.FileName) + "\""); this.Response.AddHeader("Charset", "iso-8859-1"); this.Response.ContentType = contentTypeHeader; BinaryWriter writer = new BinaryWriter(this.Response.OutputStream); writer.Write(doc.Content); this.Response.End(); } else { try { Response.Redirect(doc.HTTP); } catch { } } }
voire même à la fin, unCode:Response.BinaryWrite(doc.Content);
C'est éxactement mon cas, je travaille sur une GED et j'ai besoin que un fichier (tif,doc,pdf seulement) soit ouvert soit via une popup ou tout autre moyen, dans le bon logiciel. Le but étant d'éviter que les utilisateurs n'aient à cliquer sur "ouvrir" ou tout autre bouton.
Pour la question de la faille de sécurité, je m'en doutais un peu, mais je vais étudier ton code Louis-Guillaume et essayer de le mettre en application sur ma page aspx.cs.
merci
nananananna. tu voulais dire, je vais le mettre dans ma page ashx!! (generic handler) ;)Citation:
de le mettre en application sur ma page aspx.cs.
c'est comme ca que vas améliorer les performances.
Bon, je ne connais pas les ashx, mais je test.
J'ai donc, après création de la page ashx ce code :
Déja pour essayer de comprendre, j'ai exécuté cette page depuis mon application, pour voir ce que ca donne.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 namespace SidesWebProject.SidesCustom { /// <summary> /// Description résumée de $codebehindclassname$ /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class ViewItem : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; context.Response.Write("Hello World"); } public bool IsReusable { get { return false; } } } }
Bon j'ai un gentil message d'erreur qui me dit qu'il ne peut charger le contenu xml, mais en dessous des msgs d'erreurs, j'ai un "hello world" qui apparait.
La page est bien chargée quand même.
Maintenant, je vais rajouter ton code Louis-Guillaume, mais j'ai une question sur le "int id" que tu utilises dans LoadFile, quelle valeur lui donner au départ ? 0 ?
Aussi, les 2 méthodes que tu m'as donné, tu les appelles quand ?
A partir de la méthode : public void ProcessRequest(HttpContext context) ?
Merci d'avance.
le int que j'appelle, c'est un paramètre GET.
par exemple
où id est l'id de mon document en base de donnée.Code:monsite/download.ashx?id=1
donc dans mon Page_Load, je récupère l'id puis appelle mes méthodes.
Dans mon ashx, je n'ai que trois méthodes
Page_Load et les deux que je t'ai donné, strictement rien d'autre.
Salut,Y'a ça aussi:Une fonction qui va lire la base de registre pour trouver le bon type MIME.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 /// <summary> /// This method retreive all the MIME type from the registry and compare it to the file extension /// </summary> /// <param name="filepath">The full path to the file</param> /// <returns></returns> public static string GetMimeType(string filepath) { RegistryPermission regPerm = new RegistryPermission(RegistryPermissionAccess.Read, "\\HKEY_CLASSES_ROOT"); RegistryKey classesRoot = Registry.ClassesRoot; FileInfo fi = new FileInfo(filepath); String dotExt = fi.Extension.ToLower(); RegistryKey typeKey = classesRoot.OpenSubKey(@"MIME\Database\Content Type"); string Keyname = String.Empty; foreach (string keyname in typeKey.GetSubKeyNames()) { if ((String)classesRoot.OpenSubKey(@"MIME\Database\Content Type\" + keyname).GetValue("Extension") == dotExt) { Keyname = keyname; break; } } return Keyname; }
A+