2010-11-10 25 views
1

Nous avons un lien de téléchargement de fichier PDF sur une page Web avec un programme CGI en langage C transmettant le fichier depuis le serveur web de notre appareil embarqué. Le serveur Web est personnalisé en raison de limitations de mémoire importantes.Quel en-tête HTTP est nécessaire pour que les navigateurs Web utilisent le nom de fichier suggéré? (Téléchargement de fichier à partir de CGI en C)

Le nom de fichier suggéré par le programme C est "Manual.pdf".

Sur Internet Explorer 8, lorsque nous cliquons sur le lien, la boîte habituelle «Ouvrir/Enregistrer» s'ouvre et le nom de fichier suggéré affiché est «download.pdf», ce qui est faux. Sur Firefox, le nom de fichier suggéré est "download.cgi", ce qui est pire. Cependant, les deux navigateurs indiquent correctement que le téléchargement est de type PDF.

Voici quelques extraits non apparentés de code pour afficher les en-têtes nous reviennent:

{ CONTENT_TYPE_PDF, "application/pdf\nContent-Disposition:attachment;" } 
sprintf(tmpBuf, "Content-Type: %s\n", get_tbl_string((tbl_str_itm_t*)content_type, session->response.contenttype)); 
strcpy(tmpBuf, "filename=Manual.pdf\n"); 
strcat(tmpBuf, "Cache-Control: no-cache, no-store\n"); 

Quelqu'un peut-il dire ce que nous faisons mal?

Toute aide grandement appréciée.

Meilleures salutations, Bert

+0

Êtes-vous sûr de vouloir 'strcpy' dans un tampon vous venez de remplir? –

+0

Etes-vous sûr de vouloir utiliser strcpy, strcat et sprintf - qui ne font aucune sorte de vérification des limites sur votre tampon - dans une application Web? (Il est mauvais dans * chaque * application, mais faire une telle chose dans une application CGI ne fait que demander des ennuis) –

Répondre

3

Les choses "nom de fichier" fait partie de l'en-tête content-disposition. En-tête est une bonne solution, mais cela ne fonctionne pas bien si votre nom de fichier a des caractères non-anglais.

3

Content-Disposition: attachment; filename=Manual.pdf Une autre solution consiste à ajouter le chemin "/Manual.pdf" à votre script cgi, c'est-à-dire utiliser des URL comme: http://server/path/my.cgi/Manual.pdf, puis votre programme my.cgi sera appelé avec PATH_INFO=/Manual.pdf. Pour les noms de fichiers funky, cela fonctionne mieux que l'en-tête Content-Disposition.

Mise à jour: Si vous êtes intéressé par le support de navigateur pour Content-Disposition en-tête, vérifiez http://greenbytes.de/tech/tc2231/.

Mise à jour: Un autre article intéressant sur le sujet: http://blogs.msdn.com/b/ieinternals/archive/2010/06/07/content-disposition-attachment-and-international-unicode-characters.aspx