<%
Response.Buffer = true
Server.ScriptTimeout = 180
On Error Resume Next
'---------------------------------------------------------------------------------------------------------
'declare all variables at top of page is best practice
'---------------------------------------------------------------------------------------------------------
Dim strFullFileName,strSplitArray,intUpper,strFileName,strPath,strServerName,strServerRoot,strFinalPath,strFinalDownload,strAbsFile,objFSO,objFile,objStream
'---------------------------------------------------------------------------------------------------------
'set variables
'---------------------------------------------------------------------------------------------------------
strFullFileName = CStr(Request.QueryString("FilePath"))'get full href and convert to string
strSplitArray = Split(strFullFileName,"/")'split above string at each forward slash
intUpper = Ubound(strSplitArray)'takes last part of split which will be the last number ie: the file name
strFileName = SplitArray(intUpper)'file name is last part of url
strPath = Replace(strFullFileName,strFileName,"")'gets the path to the image
strServerName = Request.ServerVariables("Server_Name")'gets domain url ie: www.yourdomain.com
strServerRoot = Server.MapPath("\")'gets the proper path to the root of the server
strFinalPath = Replace(Replace(Replace(Replace(strFullFileName,strServerName,""),strFileName,""),"http://",""),"/","\")'leaves me with the path to the image
strFinalDownload = strFinalPath&strFileName'add our new path and file name together and we have what we needed!
'---------------------------------------------------------------------------------------------------------
'do some basic error checking for the QueryString
'---------------------------------------------------------------------------------------------------------
If strPath = "" Then
Response.Clear
Response.Write("No file specified.")
Response.End
ElseIf InStr(strPath, "..") > 0 Then
Response.Clear
Response.Write("Illegal folder location.")
Response.End
ElseIf Len(strPath) > 1024 Then
Response.Clear
Response.Write("Folder path too long.")
Response.End
Else
Call DownloadFile(strFinalDownload)
End If
'---------------------------------------------------------------------------------------------------------
'now call the function that does all the work
'---------------------------------------------------------------------------------------------------------
Private Sub DownloadFile(file)
'set absolute file location which our new path from the websites root (thats what all the work above was for)
strAbsFile = Server.MapPath("\")&strFinalDownload
'create FSO object to check if file exists and get properties
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
'check to see if the file exists
IF (objFSO.FileExists(strAbsFile)) THEN
'grab the file
Set objFile = objFSO.GetFile(strAbsFile)
'first clear the response, and then set the appropriate headers
Response.Clear
'the filename you give it will be the one that is shown to the users by default when they save
'could be easy to give user the choice too name the file by passing a variable and replacing that with 'objFile.Name' below
Response.AddHeader "Content-Disposition", "attachment; filename=" & objFile.Name
Response.AddHeader "Content-Length", objFile.Size
Response.ContentType = "application/octet-stream"
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
'set as binary
objStream.Type = 1
Response.CharSet = "UTF-8"
'load into the stream the file
objStream.LoadFromFile(strAbsFile)
'send the stream in the response
Response.BinaryWrite(objStream.Read)
objStream.Close
Set objStream = Nothing
Set objFile = Nothing
ELSE
Response.Clear
Response.Write("No such file exists.")
END IF
'release memory
objFSO.Close
Set objFSO = Nothing
End Sub
%>