Avatar billede thundergod Nybegynder
17. november 2004 - 13:59 Der er 9 kommentarer og
1 løsning

Browser accepterer ikke fildownload

Hej,

Jeg har et lille system der sender en forespurgt fil tilbage browseren. Min hensigt er at filen skal sendes direkte, således at browseren kan vise en gem/åben dialog eller vise filens indhold direkte (hvis indholdet er registreret til dette, f.eks. pdf).
Til dette har jeg to spørgsmål:
1. Hvorfor vil browseren ikke acceptere følgende HTTP 200 svar med 'attached' fil?
2. Hvorfor læser den ikke filnavnet, selvom det er medtaget i HTTP headeren? (den viser istedet URL til filen)

Her er Hvad HTTPLook opfangede da browseren efterspurgte filen:
------------------------------------------
HTTP/1.1 200 OK
Server: Resin/3.0.8
Pragma: No-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Disposition: attachment; filename="SPA-2000.pdf"
Content-Type: application/pdf
Transfer-Encoding: chunked
Date: Wed, 17 Nov 2004 12:11:50 GMT

000000  31 63 30 30 0D 0A 25 50  44 46 2D 31 2E 34 0D 25  1c00..%PDF-1.4.%
000010  E2 E3 CF D3 0D 0A 33 30  20 30 20 6F 62 6A 20 3C  âã....30 0 obj <
000020  3C 2F 4C 69 6E 65 61 72  69 7A 65 64 20 31 2F 4C  </Linearized 1/L
000030  20 37 30 35 31 34 32 2F  4F 20 33 33 2F 45 20 33  705142/O 33/E 3
...Her vælger vi at klippe resten væk, da det er temmelig mange bytes...
Avatar billede thundergod Nybegynder
17. november 2004 - 14:01 #1
Det skal lige siges, at jeg i HTTPLook kan vælge at åbne ovennævnte data som den fil det nu en gang er, hvorefter Adobe Acrobat fint åbner den ovennævnte pdf fil.
Avatar billede arne_v Ekspert
17. november 2004 - 21:30 #2
Har du prøvet:

Content-Disposition: attachment; filename=SPA-2000.pdf

?
Avatar billede arne_v Ekspert
17. november 2004 - 21:32 #3
Har du prøvet:

Content-Type: application/x-download

?
Avatar billede thundergod Nybegynder
17. november 2004 - 22:43 #4
Hej Arne,
Jeg vil da lige prøve det førstnævnte.
mimetype vil, i min kode, altid følge filen,
Men jeg kan da prøve med den content-type.
Jeg mener dog at det kan påvirke browsere til at *altid* vise download dialog e.l. istedet for at prøve at åbne direkte (hvilket er en fordel i .pdf eksemplet).
Svarer tilbage i morgen om resultatet af ovennævnte forslag..
Avatar billede thundergod Nybegynder
18. november 2004 - 13:23 #5
Hej igen Arne,
Jeg har prøvet begge metoder, men det var slet ikke det der var noget i vejen med.
Problemet var følgende:
Internet Explorer 6.0 kan ikke acceptere at "Cache-Control: no-cache" er sat når den skal downloade filer. Derfor gik det galt. I Netscape 7.0 og Firefox 1.0 virkede det hele tiden, da de ikke kræver at Content allerede er "lidt" i cachen. Når man ser på HTTP strømmen kan man også se at Internet Explorer holder datastrømmen hen, indtil brugeren har trykket på enten Save, Open eller Cancel. De andre browsere downloader lystigt i baggrunden.
Jeg løste det ved at sætte "Content-Control: private" der betyder at data kun skal caches på pr. bruger basis.

Næste side af samme problem er så:
Uanset hvordan jeg gør, får jeg Open, Save, Cancel dialogen frem...
Det irriterer mig lidt, da jeg godt kunne tænke mig at pdf filen blev vist direkte i browseren (forudsat at Acrobat reader installeret) Det har jeg set andre steder, måske kan vi også gøre det her..
Nogen idéer?
Avatar billede thundergod Nybegynder
18. november 2004 - 13:43 #6
Det virker som om at Internet Explorer kun ser på "filnavnet" på den forespurgte URL. F.eks. bliver: (document.pdf ligger ved siden af html filen)
  <a href="document.pdf">Open Document</a>
vist direkte i browseren (med plug-in).
Hvorimod at: (download er en servlet der skriver det ønskede dokument på response strømmen )
  <a href="someServer/download?oid=1234">Open document</a>
bliver vist som Save,Open,Cancel dialog.
IE kan dog sagtens se at der er tale om en pdf..
Avatar billede cayman Nybegynder
29. november 2004 - 11:22 #7
Hej - jeg blander mig lige lidt i debatte                                n
Hvis du vil undgå at få open-save dialog frem skal du sætte content-typen til "application/pdf". Herefter trækker du en FileOutputStream ud af dit response-objekt. Og så er det bare at fyre den af..
Jeg har vedlagt lidt kode..
         
         
InputStream tempStream = .. (her skal du lave en inputstream fra din fil) ..

if (tempStream != null) {
    response.setContentType("application/pdf");

    from = new BufferedInputStream(tempStream);
    to = new BufferedOutputStream(resp.getOutputStream());

    byte[] buffer = new byte[4096]; // A buffer to hold file contents
    int bytes_read;

    // How many bytes in buffer
    while ((bytes_read = from.read(buffer)) != -1) {
        to.write(buffer, 0, bytes_read); //  write bytes
    }
}
Avatar billede cayman Nybegynder
29. november 2004 - 11:28 #8
Nå ja - så skal du jo lige have lukket stream'erne igen..
if (from != null) {
    try {
        from.close();
    }
    catch (IOException e) {
      ...
    }
}

if (to != null) {
    try {
        to.close();
    }
    catch (IOException e) {
        ...
    }
}
Avatar billede thundergod Nybegynder
06. juni 2007 - 11:30 #9
Ret gammelt indlæg, men kom med svar så fordeler jeg points.. :-)
Avatar billede arne_v Ekspert
07. juni 2007 - 02:11 #10
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester