简体   繁体   中英

Classic ASP download PDF on page load

I want to create a page that can display a message "Your download is about to begin" and then after a couple seconds open a "save as" dialogue which allows the visitor to download a file. Is this possible in Classic ASP VB Script? I know how to make a page stream a file, but it doesn't show the html of the page. The file I am offering is 20Mb so the script needs to handle large files sizes.

I currently have a meta redirect in place:

<meta http-equiv="refresh" content="2; url=/downloads/brochures/ACET_Products_and_Services_Directory_2013-14.pdf" />

But this isn't really any good.

I have asppdf installed on my server, and gave this a go:

<%
Set Pdf = Server.CreateObject("Persits.Pdf")
Set Doc = Pdf.OpenDocument("d:/websites/common/downloads/brochures/ACET_Products_and_Services_Directory_2013-14.pdf")
Doc.SaveHttp "attachment;filename=ACET_Products_and_Services_Directory_2013-14.pdf"
%>

This gets around the large file, but you can't stream the file and display HTML at the same time.

I have found plenty of ways to stream the file to the browser, but I can't it to do this after the page has been displayed.

This is another one I have tried:

<% 
    Response.Buffer = False 
    Server.ScriptTimeout = 30000 

    Response.ContentType = "application/x-unknown" ' arbitrary 
    fn = "ACET_Products_and_Services_Directory_2013-14.pdf" 
    FPath = "d:\websites\common\downloads\brochures\" & fn 
    Response.AddHeader "Content-Disposition", "attachment; filename=" & fn 

    Set adoStream = CreateObject("ADODB.Stream") 
    chunk = 2048 
    adoStream.Open() 
    adoStream.Type = 1 
    adoStream.LoadFromFile(FPath) 

    iSz = adoStream.Size 

    Response.AddHeader "Content-Length", iSz 

    For i = 1 To iSz \ chunk 
        If Not Response.IsClientConnected Then Exit For 
        Response.BinaryWrite adoStream.Read(chunk) 
    Next 

    If iSz Mod chunk > 0 Then 
        If Response.IsClientConnected Then 
            Response.BinaryWrite adoStream.Read(iSz Mod chunk) 
        End If 
    End If 

    adoStream.Close 
    Set adoStream = Nothing 

    Response.End 
%>

With this I get a Error code: ERR_INVALID_RESPONSE from Chrome.

This is one that I have tried that almost works:

<% 
strFilePath = "d:/web sites/common/downloads/brochures/ACET_Products_and_Services_Directory_2013-14.pdf"

Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists(strFilePath) Then
Set objFile = objFSO.GetFile(strFilePath)
intFileSize = objFile.Size
Set objFile = Nothing

strFileName = "ACET_Products_and_Services_Directory_2013-14.pdf"
Response.AddHeader "Content-Disposition","attachment; filename=" & strFileName

Response.ContentType = "application/x-msdownload"
Response.AddHeader "Content-Length", intFileSize

Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = 1 'adTypeBinary
objStream.LoadFromFile strFilePath
Do While Not objStream.EOS And Response.IsClientConnected
Response.BinaryWrite objStream.Read(1024)
Response.Flush()
Loop
objStream.Close
Set objStream = Nothing
Else
Response.write "Error finding file."
End if
Set objFSO = Nothing
%>

I then used <% response.redirect("download.asp") %> on the page I want it to download from, but as soon as I hit the page I get the file, but no page. Its this part I am struggling with.

SUCCESS!

<script> 
window.location.replace('download.asp'); 
</script>

Cheers,

Steve

With a little more trial and error I discovered creating a file called download.asp and putting this code in worked:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<% 
strFilePath = "d:/websites/common/downloads/brochures/ACET_Products_and_Services_Directory_2013-14.pdf"

Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists(strFilePath) Then
Set objFile = objFSO.GetFile(strFilePath)
intFileSize = objFile.Size
Set objFile = Nothing

strFileName = "ACET_Products_and_Services_Directory_2013-14.pdf"
Response.AddHeader "Content-Disposition","attachment; filename=" & strFileName

Response.ContentType = "application/pdf"
Response.AddHeader "Content-Length", intFileSize

Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = 1 'adTypeBinary
objStream.LoadFromFile strFilePath
Do While Not objStream.EOS And Response.IsClientConnected
Response.BinaryWrite objStream.Read(1024)
Response.Flush()
Loop
objStream.Close
Set objStream = Nothing
Else
Response.write "Error finding file."
End if
Set objFSO = Nothing
%>

I then placed this code on the page I wanted to display the instructions and then offer the automatic download:

<script> 
window.location.replace('download.asp'); 
</script>

I hope someone else finds this useful.

Steve

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM