Jag har gjort en asp sida för nedladdning av pdf filer. Sidan fungerar bra förutom att IIS sabbar för vissa browsers genom att svara med två Content Type fält i headern. Ex: Nu är jag inte riktigt säker men försök att lägga response.header på översta raden i din asp-kod, se sen till att det inte finns en massa html-kod liggandes under. Att två skrivs måste bero på att din IIS default lägger upp den typen på varje sida och för att undvika det, skriv ingen htmlkod på den asp-sidan. Hej! Typiskt, man kommer alltid på svaret när man precis ställt frågan...Response.AddHeader "Content-Type" ger två Content-Type
Så här kan svaret se ut om man länkar direkt till en pdf fil:
<code>
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Wed, 22 Jan 2003 12:05:25 GMT
Content-Type: application/pdf
Accept-Ranges: bytes
Last-Modified: Wed, 22 Jan 2003 12:04:26 GMT
ETag: "40b5e168ec2c21:8a6"
Content-Length: 1695
</code>
Som ni ser så är det 1 "Content-Type" fält i denna header. Här kommer en header så som min webbserver svarar när jag kört Response.AddHeader "Content-Type", "application/pdf"
<code>
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Wed, 22 Jan 2003 12:06:37 GMT
Connection: close
Pragma: no-cache
Content-Type: application/pdf
Content-Length: 1695
Content-Type: text/html
</code>
I detta svar så kommer Content-Type 2 gånger, varav den sista inte borde vara med. Hur gör jag för att få bort denna?
// AndreasSv: Response.AddHeader "Content-Type" ger två Content-Type
Säg till om det hjälper eller hur du kom förbi problemet. Information som detta är mycket bra att ha i forumet om andra får problem.Sv: Response.AddHeader
Jag har försökt fixa detta men lyckas tyvärr inte. Här kommer en listning på en lite avskalad variant av min sida.
<code>
<%
Option Explicit
Const ForReading = 1
Const TristateTrue = -1 'Unicode
Const FILE_TRANSFER_SIZE = 16384 '16k
Response.Buffer = True
dim sucess, filename, path, mimeType, batch_id
filename = "x.pdf"
path = "e:\websajter\"
mimeType = "application/pdf"
sucess = TransferFile(filename, path, mimeType)
Function TransferFile(filename, path, mimeType)
Dim objFileSystem, objFile, objStream
Dim char
Dim sent
TransferFile = True
Set objFileSystem = Server.CreateObject("Scripting.FileSystemObject")
Set objFile = objFileSystem.GetFile(Path & filename)
Set objStream = objFile.OpenAsTextStream(ForReading, TristateTrue)
Response.AddHeader "Content-Type", mimeType
Response.AddHeader "Content-Length", objFile.Size
Response.AddHeader "Content-Disposition", "attachment;filename=" & filename
Do While Not objStream.AtEndOfStream
char = objStream.Read(1)
Response.BinaryWrite(char)
sent = sent + 1
If (sent MOD FILE_TRANSFER_SIZE) = 0 Then
Response.Flush
If Not Response.IsClientConnected Then
TransferFile = False
Exit Do
End If
End If
Loop
Response.Flush
If Not Response.IsClientConnected Then TransferFile = False
objStream.Close
Set objStream = Nothing
Set objFileSystem = Nothing
End Function
%>
</code>
Bara för att testa så gjorde jag även en väldigt avskalad sida så här:
<code>
<%
Response.AddHeader "Content-Type", "application/pdf"
Response.Write("test")
%>
</code>
Det blir samma problem ändå.
Antagligen så får alla detta fel, men man märker inte av det om man bara använder IE. Däremot i mozilla baserade webbläsare så får man problem eftersom de använder den content-type som kommer sist.
Jag kör på Win2000 Adv Srv. SP3 med alla hotfixar.
För att enkelt kunna se hur headern ser ut så använder jag proxomitron: http://www.proxomitron.org/
// AndreasSv: Response.AddHeader
Man använder ju såklart
<code>
Response.ContentType = "application/pdf"
</code>
istället för Addheader
ganska självklart att Addheader lägger till en ny header och inte tar bort den gamla. Man ska inte ta för givet att exempelkod man hittar på nätet är feldri...
// Andreas