0

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


enter image description here


enter image description here


enter image description here


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
4

2 回答 2

1

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

于 2013-10-17T00:14:07.670 回答
0

当您打开对话框保存文件时,扩展名是空的 ( . )。将文件名另存为“YourFileName.txt”或“YourFileName.pdf”。如果您仍然遇到问题,请尝试使用扩展名不同的名称。

于 2015-09-19T13:11:12.000 回答