下载文件无法识别文件类型/文件扩展名?

时间:2013-10-16 23:49:48

标签: vb.net

嗨,我有以下子程序 它要求用户保存或另存为文件 问题是没有扩展就可以保存它。

文件类型是GIF或PDF。 有没有办法让例程自动确定它是PDF还是GIF?

变量sFullPath具有扩展名 例如 sFullPath = C:\ PICTURES \ 10603-1.gif或 sFullPath = C:\ PICTURES \ 10603-1.pdf

屏幕截图,注意保存为文件对话框没有给出任何扩展名


enter image description here


enter image description here


enter image description here


这是我的代码

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

1 个答案:

答案 0 :(得分:1)

您应该尝试通过将内容处置添加到标题来设置内容处置。这将允许您指定文件名。