01. september 2005 - 09:54Der 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
Støv, fibre og metalliske partikler kan påvirke både uptime, levetid og driftssikkerhed. Derfor arbejder flere datacentre systematisk med contamination control.
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.
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
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".
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")
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.
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
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 :)
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.
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?
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.