Hi I have the following sub routine It ask user to save or save as the file the problem is it saves it without extension.
the file type is either GIF or PDF. is there a way to make the routine automagically figure out if it is PDF or GIF?
the variable sFullPath has the extension for example sFullPath = C:\PICTURES\10603-1.gif or sFullPath = C:\PICTURES\10603-1.pdf
Screenshot , notice how the save as file dialog is not giving any extension
Here is my code
Private Sub DownloadFile(sFullPath As String, context As HttpContext)
Dim size, start, [end], length As Long
Dim fp As Long = 0
Using reader As New StreamReader(sFullPath)
size = reader.BaseStream.Length
start = 0
[end] = size - 1
length = size
' Now that we've gotten so far without errors we send the accept range header
'/* At the moment we only support single ranges.
' * Multiple ranges requires some more work to ensure it works correctly
' * and comply with the spesifications: http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2
' *
' * Multirange support annouces itself with:
' * header('Accept-Ranges: bytes');
' *
' * Multirange content must be sent with multipart/byteranges mediatype,
' * (mediatype = mimetype)
' * as well as a boundry header to indicate the various chunks of data.
' */
context.Response.AddHeader("Accept-Ranges", "0-" & size)
' header('Accept-Ranges: bytes');
' multipart/byteranges
' http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2
If Not String.IsNullOrEmpty(context.Request.ServerVariables("HTTP_RANGE")) Then
Dim anotherStart As Long = start
Dim anotherEnd As Long = [end]
Dim arr_split As String() = context.Request.ServerVariables("HTTP_RANGE").Split(New Char() {Convert.ToChar("=")})
Dim range As String = arr_split(1)
' Make sure the client hasn't sent us a multibyte range
If range.IndexOf(",") > -1 Then
'// (?) Shoud this be issued here, or should the first
'// range be used? Or should the header be ignored and
'// we output the whole content?
context.Response.AddHeader("Content-Range", "bytes " & start & "-" & [end] & "/" & size)
Throw New HttpException(416, "Requested Range Not Satisfiable")
End If
'// If the range starts with an '-' we start from the beginning
'// If not, we forward the file pointer
'// And make sure to get the end byte if spesified
If (range.StartsWith("-")) Then
'// The n-number of the last bytes is requested
anotherStart = size - Convert.ToInt64(range.Substring(1))
Else
arr_split = range.Split(New Char() {Convert.ToChar("-")})
anotherStart = Convert.ToInt64(arr_split(0))
Dim temp As Long = 0
anotherEnd = If(arr_split.Length > 1 And Int64.TryParse(arr_split(1).ToString(), temp), Convert.ToInt64(arr_split(1)), size)
End If
'/* Check the range and make sure it's treated according to the specs.
' * http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
' */
'// End bytes can not be larger than $end.
'anotherEnd = (anotherEnd > [end]) ? end : anotherEnd
anotherEnd = If((anotherEnd > [end]), [end], anotherEnd)
'// Validate the requested range and return an error if it's not correct.
If (anotherStart > anotherEnd Or anotherStart > size - 1 Or anotherEnd >= size) Then
context.Response.AddHeader("Content-Range", "bytes " & start & "-" & [end] & "/" & size)
Throw New HttpException(416, "Requested Range Not Satisfiable")
End If
start = anotherStart
[end] = anotherEnd
length = [end] - start + 1 ' Calculate new content length
fp = reader.BaseStream.Seek(start, SeekOrigin.Begin)
context.Response.StatusCode = 206
End If
End Using
'// Notify the client the byte range we'll be outputting
context.Response.AddHeader("Content-Range", "bytes " & start & "-" & [end] & "/" & size)
context.Response.AddHeader("Content-Length", length.ToString())
'// Start buffered download
context.Response.WriteFile(sFullPath, fp, length)
context.Response.End()
End Sub