[Perl/CGI] Bestandsnaam opgeven aan http-server

Pagina: 1
Acties:

  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
Hoi.

Basisinfo:
Ik ben bezig met een Perl-scriptje dat aan de hand van enkele voorwaarden een bepaald bestand moet teruggeven. Het script staat en draait op een http-server, en de client komt dus binnen met een gewone browser. Welk bestand teruggegeven moet worden, hangt af van die voorwaarden. De bestanden staan verspreid over de harde schijf en het is niet practisch om ze in de directory van de webserver te zetten.

Software:
Ik werk met Windows 98. Xitami is mijn webserver. Ik gebruik de ActiveState port van Perl, versie 5.6.1.

Het probleem:
Het script loopt lekker, bepaalt welk bestand er teruggegeven moet worden, opent dat, leest dat in en stuurt dat dan weer naar de server, die het doorgeeft aan de client. Dat werkt dus goed. Maar omdat de browser natuurlijk een GET gedaan heeft op dldoc.pl (zo heet het script), wil hij het te downloaden bestand (bijvoorbeeld nfeb04.doc) opslaan als dldoc.pl.
Ik begrijp waarom dat zo gebeurt, want de client weet niet anders dan dat hij dldoc.pl zit te downloaden, en heeft niet door dat hij in feite de inhoud van nfeb04.doc doorkrijgt.

De vraag:
Hoe kan ik ervoor zorgen dat de client weet dat het te downloaden bestand nfeb04.doc (of njan04.doc, of ndec03.doc, dat ligt dus aan die voorwaarden welke het is) moet heten, en niet dldoc.pl?

Het geprobeerde:
Ik heb gekeken naar welke headers HTTP allemaal kent en ik hoopte dat daar iets tussen zou staan als 'Filename: blaat' maar helaas.
Verder heb ik wel een vatsig truukje bedacht, maar daar ben ik niet zo heel blij mee: het script kopieert het te downloaden bestand naar de eigen directory en returnt een klein automatisch gegenereerd bestandje met daarin een HTTP-header (weet zo ff niet meer welke) die ervoor zorgt dat de browser het zojuist gekopieerde bestand gaat downloaden. Dan klopt de bestandsnaam wel, maar het is nogal een slordige work-around vind ik.

De dank bij voorbaat:
Bij voorbaat dank.

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • _DeWie_
  • Registratie: November 2001
  • Laatst online: 10-04 16:23
Je moet in de header het juiste content-type opgeven, bijvoorbeeld :

Content-Type: application/pdf

Verder kun je middels de header ook een naam opgeven.
Hoe dat moet kun je even kijken staat volgens mij in de man CGI

  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
_DeWie_ schreef op 20 februari 2004 @ 15:21:
Je moet in de header het juiste content-type opgeven, bijvoorbeeld :

Content-Type: application/pdf
Mja, dat gebeurt ook wel, maar dan blijft alsnog de bestandsnaam verkeerd. Immers weet de browser nog steeds niet beter dan dat hij een 'GET /cgi-bin/dldoc.pl HTTP/1.1' heeft uitgevoerd.
Verder kun je middels de header ook een naam opgeven.
Hoe dat moet kun je even kijken staat volgens mij in de man CGI
Ah, dat zou mooi zijn! Maar... heb je dan ook enig idee hoe ik vanaf een Windows-bak man-pages kan bekijken?

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

[search=filename header]
RFC 1341 also defined the use of a "NAME" parameter which gave a suggested file name to be used if the data were to be written to a file. This has been deprecated in anticipation of a separate Content-Disposition header field, to be defined in a subsequent RFC.
Dus iets als
code:
1
Content-Disposition: attachment; $filename
zou moeten werken :)

[ Voor 3% gewijzigd door Spider.007 op 20-02-2004 16:57 ]

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
Spider.007 schreef op 20 februari 2004 @ 16:40:
[search=filename header]

Dus iets als
code:
1
Content-Disposition: attachment; $filename
zou moeten werken :)
Bijna goed! Even voor alle correctheid plaats ik nog de werkende code:

code:
1
Content-Disposition: attachment; filename=\"$filename\"


Bedankt voor de hulp!

[ Voor 3% gewijzigd door muba op 20-02-2004 17:24 ]

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • Juup
  • Registratie: Februari 2000
  • Niet online
En als je nou ook nog de content-length opgeeft dan krijg je bij het downloaden een mooie progressbar van je browser :)

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
Juup schreef op 21 februari 2004 @ 00:26:
En als je nou ook nog de content-length opgeeft dan krijg je bij het downloaden een mooie progressbar van je browser :)
Die had ik al gedaan :)
code:
1
print "Content-Length: " . -s $filename . "\n";

Maar toch bedankt voor de tip!

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea

Pagina: 1