嗨,我有以下子程序 它要求用户保存或另存为文件 问题是没有扩展就可以保存它。
文件类型是GIF或PDF。 有没有办法让例程自动确定它是PDF还是GIF?
变量sFullPath具有扩展名 例如 sFullPath = C:\ PICTURES \ 10603-1.gif或 sFullPath = C:\ PICTURES \ 10603-1.pdf
屏幕截图,注意保存为文件对话框没有给出任何扩展名
这是我的代码
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
答案 0 :(得分:1)
您应该尝试通过将内容处置添加到标题来设置内容处置。这将允许您指定文件名。