Avatar billede larsbachmanndk Nybegynder
01. september 2005 - 09:54 Der er 30 kommentarer og
1 løsning

Downloade fil, istedet for at åbne den i browseren.

Jeg har et lille system hvor jeg lister en række filer, som er tilgængelig for en specifik bruger.

Disse filer er bl.a. Excel og word dokumenter.
Jeg henter filnavnet fra en Access database, og linker derved til filen, men jeg søger et script som åbner dialogboksen "gem som" istedet for at filerne åbner i browseren.

Ligesom hvis man downloader en sourcecode på eks.vis activedeveloper.dk
Avatar billede softspot Forsker
01. september 2005 - 10:23 #1
Hvis du linker til en asp-side med filen til download som parameter, kan du streame filen ud. I den forbindelse har du mulighed for at sætte nogle headers som angiver om filen skal åbnes i browseren/programmet eller gemmes på disk.

Disse headers er:

Response.AddHeader("Content-Disposition", "attachment; filename=filnavn.doc")

og så sende den tilbage via

Response.BinaryWrite data

data er så det indhold du har hentet fra filen et eller andet sted på serveren...
Avatar billede softspot Forsker
01. september 2005 - 10:26 #2
Du skal muligvis også sætte content-type headeren

Response.AddHeader("Content-Type", "application/msword; charset=iso-8859-1")

inden du sender data tilbage, så klienten ved hvad det er den modtager.

Alternativt til application/msword kan du bruger application/octet-stream.
Avatar billede larsbachmanndk Nybegynder
01. september 2005 - 10:41 #3
Umiddelbart lyder det lidt indviklet i mine øre.
Men jeg ved heller ikke meget om headers og content-types osv.

Jeg linker til filen således:
files.asp?f_id=7

Og når man åbner filen files.asp henter den filnavnet med f_id=7 i databasen.
og det kunne eksempelvis være (fil23.xls)

Men normal vis når man åbner et link til en excel fil, så åbner den jo bare filen i browseren, men er det ikke noget ASP der kan åbne dialogboksen (gem fil/åben fil) eller hvad den nu hedder, og så linke til fil23.xls
Avatar billede softspot Forsker
01. september 2005 - 10:46 #4
Umiddelbart er jeg enig i at det er lidt bøvlet, men det er i det mindste en måde at gøre det du efterspørger... :)

Hvordan får du sendt filen tilbage til klienten nu?
Avatar billede larsbachmanndk Nybegynder
01. september 2005 - 10:52 #5
Lige nu åbner files.asp filen i en frame, men det er kun fordi jeg stdig er i testfasen. Det er meningen at files.asp skal tælle antal downloads (det har jeg dog styr på), og derefter åbne vinduet "gem fil som".

Lige som her: http://activedeveloper.dk/download/default.asp?mode=download&id=254
Avatar billede larsbachmanndk Nybegynder
01. september 2005 - 11:23 #6
Jeg har testet lidt med dit forslag (kl. 10:23:17)
Men hvordan sætter jeg filnavnet = det rigtige filnavn?

Response.AddHeader("Content-Disposition", "attachment; filename=filnavn.doc")

filename=filnavn.doc skal ændres til filename = rsFile("filename")

Hvordan gør man det?
Avatar billede softspot Forsker
01. september 2005 - 12:22 #7
Response.AddHeader("Content-Disposition", "attachment; filename=" & rsFile("filname"))
Avatar billede larsbachmanndk Nybegynder
01. september 2005 - 13:58 #8
følgende fejl:
Der kan ikke bruges parenteser ved kald af en Sub
Avatar billede larsbachmanndk Nybegynder
01. september 2005 - 14:58 #9
Nu har jeg fundet frem til denne kode. den er også baseret på Response.AddHeader.
Problemet er bare at selvom den downloader filerne, så ser indholdet i filerne meget mærkeligt ud.

her er koden:

<%
filename = server.mappath("UploadFiles/" & rsFile("filename"))
Set objStream = Server.CreateObject("ADODB.Stream")
  objStream.Open
  Const adTypeBinary = 1
  objStream.Type = adTypeBinary
  objStream.LoadFromFile filename
  Select Case right(filename,3)
        Case "asf"
            ContentType = "video/x-ms-asf"
        Case "avi"
            ContentType = "video/avi"
        Case "doc"
            ContentType = "application/msword"
        Case "zip"
            ContentType = "application/zip"
        Case "xls"
            ContentType = "application/vnd.ms-excel"
        Case "gif"
            ContentType = "image/gif"
        Case "jpg", "jpeg"
            ContentType = "image/jpeg"
        Case "wav"
            ContentType = "audio/wav"
        Case "mp3"
            ContentType = "audio/mpeg3"
        Case "mpg", "mpeg"
            ContentType = "video/mpeg"
        Case "rtf"
            ContentType = "application/rtf"
        Case "htm", "html"
            ContentType = "text/html"
        Case "asp"
            ContentType = "text/asp"
        Case Else
            'Handle All Other Files
            ContentType = "application/octet-stream"
        End Select
Response.ContentType = ContentType
Response.AddHeader "content-disposition", "attachment;filename=" & rsFile("filename")
 
Response.BinaryWrite objStream.Read
%>
Avatar billede larsbachmanndk Nybegynder
01. september 2005 - 15:01 #10
Nu har jeg prøvet med en ZIP fil, og det virker fint, men hvis jeg downloader et WORD dokument, kommer der en masse vrøvl frem, når jeg åbner det.

Indhold:
&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;&#63731;
Avatar billede larsbachmanndk Nybegynder
01. september 2005 - 15:01 #11
&#63731;&#63731;&#63731;&#63731;&#63731

det ligner bare en masse firkanter når jeg åbner dokumentet
Avatar billede softspot Forsker
01. september 2005 - 15:08 #12
Skal du ikke også sætte noget med contenttype eller charset på stream-objektet?

I øvrigt:

Select Case right(filename,3)

finder ikke "jpeg" og "mpeg" og "html" og alle andre extensions med 4 eller flere tegn... :)
Avatar billede larsbachmanndk Nybegynder
01. september 2005 - 15:25 #13
"Skal du ikke også sætte noget med contenttype eller charset på stream-objektet?
"

Hvad menes der med det?
Avatar billede softspot Forsker
01. september 2005 - 15:31 #14
Jeg er ikke sikker på at det er nødvendigt, men jeg forestillede mig bare at stream-objektet også havde brug for at vide hvilken encoding indholdet var af. Derfor spørgsmålet... men det er langt fra sikkert - bare en fornemmelse.
Avatar billede softspot Forsker
01. september 2005 - 15:33 #15
Prøv at sætte

objStream.charset = "iso-8859-1"
Avatar billede softspot Forsker
01. september 2005 - 15:35 #16
Glem det! Det fungerer kun hvis stream.type er text og det er dit jo ikke :)
Avatar billede larsbachmanndk Nybegynder
01. september 2005 - 15:40 #17
Vi er ved at være tæt på nu... :)
Men det er som om at den ikke henter indholdet af filen korrekt
Avatar billede softspot Forsker
01. september 2005 - 15:44 #18
Hvilke symptomer har du nu?
Avatar billede larsbachmanndk Nybegynder
01. september 2005 - 15:45 #19
Jeg har lavet et word dukument hvor jeg har skrevet "test".
Men efter at have downloadet filen, indehodler dokumentet bare en masse firkanter, og diverse mærkelige ting
Avatar billede softspot Forsker
01. september 2005 - 15:49 #20
Ok, altså ikke nærmere end kl. 15:01...

Jeg fik bare opfattelsen af at du var kommet længere siden dengang :)
Avatar billede larsbachmanndk Nybegynder
01. september 2005 - 15:55 #21
;) desværre...
men nu kan jeg da downloade filerne.. det er da en start. ;)
Avatar billede softspot Forsker
01. september 2005 - 16:01 #22
Sidste forsøg lige nu (skal lige noget de næste par timer):

Kan du ikke prøve at skifte

Response.ContentType = ContentType

ud med

Response.AddHeader("Content-Type", ContentType & "; charset=iso-8859-1")
Avatar billede larsbachmanndk Nybegynder
01. september 2005 - 16:06 #23
Det gjorde desværre ingen forskel.. tak for hjælpen indtil videre
Avatar billede softspot Forsker
01. september 2005 - 21:29 #24
Jeg har fået flg. til at fungere hos mig. Du skal huske at tømme din cache (og slette offline filer) når du eksperimenterer med dette her, for browseren cacher resultaterne og selvom du har rettet i stream-sourcen (f.eks. sat AddHeader ind i stedet for ContentType på Response), så er det ikke sikkert at du får det rigtige resultat tilbage. nå, men her er altså den kode hvormed jeg kunne hente et word-dokument:

<%@ language="vbscript" %>
<%
Const adTypeBinary = 1
virtualFilename = "Invitationsliste.doc"
filename = server.mappath(virtualFilename)
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = adTypeBinary
objStream.LoadFromFile filename
arrFilename = split(filename,".")
Select Case arrFilename(ubound(arrFilename))
    Case "asf"
        ContentType = "video/x-ms-asf"
    Case "avi"
        ContentType = "video/avi"
    Case "doc"
        ContentType = "application/msword"
    Case "zip"
        ContentType = "application/zip"
    Case "xls"
        ContentType = "application/vnd.ms-excel"
    Case "gif"
        ContentType = "image/gif"
    Case "jpg", "jpeg"
        ContentType = "image/jpeg"
    Case "wav"
        ContentType = "audio/wav"
    Case "mp3"
        ContentType = "audio/mpeg3"
    Case "mpg", "mpeg"
        ContentType = "video/mpeg"
    Case "rtf"
        ContentType = "application/rtf"
    Case "htm", "html"
        ContentType = "text/html"
    Case "asp"
        ContentType = "text/asp"
    Case Else
        'Handle All Other Files
        ContentType = "application/octet-stream"
End Select
Response.AddHeader "Content-Type", ContentType & "; charset=windows-1252"
Response.AddHeader "content-disposition", "attachment;filename=" & virtualFilename
 
Response.BinaryWrite objStream.Read
%>


Som du kan se så har jeg hardcoded et worddokument ved navn invitationsliste.doc, men du kan nok gennemskue at dit recordset med filnavn skal ind der i stedet :)
Avatar billede larsbachmanndk Nybegynder
02. september 2005 - 09:02 #25
Det meget mystisk det her....
Jeg snakkede tidligere om at når jeg åbnede en wordfil jeg havde downloadet, så vidste den bare noget mærkelig kode.
Nu har jeg prøvet at åbne wordfilen med notepad istedet og det den ligger i filen er hele sourcekoden fra files.asp.
Avatar billede larsbachmanndk Nybegynder
02. september 2005 - 09:27 #26
NU virker det sgu... Undskyld jeg bander ;)

Man må tilsyneladende ikke bruge noget HTML i files.asp, for så kommer det med i den downloadede fil.

smid et svar softspot, og mange tak for hjælpen
Avatar billede softspot Forsker
02. september 2005 - 09:33 #27
Velbekomme :)
Avatar billede larsbachmanndk Nybegynder
02. september 2005 - 12:58 #28
Lige et hurtigt tillægs spm, hvis du er frisk ;)

Når man opretter en bruger, opretter man samtidig en folder på serveren, som er navngivet efter brugerens id i databasen.
Disse folders bliver oprettet i mappen "Users" så hvis brugeren med id 5 vil downloade "dokument.doc"
Så skal den hentes her "Users/5/dokument.doc"
men nu kan jeg ikke få nedenstående linje til at fungere...
Hvordan skriver man mappath koden?


filename = server.mappath("Users/" & fileFolder) "/" & virtualFilename

fileFolder = brugerens id

På forhånd tak
Avatar billede softspot Forsker
02. september 2005 - 13:53 #29
Det er fordi du skal udføre mappath på HELE den virtuelle sti, således:

filename = server.mappath("Users/" & fileFolder & "/" & virtualFilename)
Avatar billede softspot Forsker
02. september 2005 - 13:53 #30
...og tak for point :)
Avatar billede larsbachmanndk Nybegynder
02. september 2005 - 13:56 #31
Så skriver den sådan her:
Der blev fundet et ugyldigt '/' eller '\' i parameteren sti for MapPath-metoden

Du kan iøvrigt svare her der har jeg oprettet et spm:
http://www.eksperten.dk/spm/644971
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