代码之家  ›  专栏  ›  技术社区  ›  Yisroel M. Olewski

.NET IHttphandler流式处理SQL二进制数据

  •  0
  • Yisroel M. Olewski  · 技术社区  · 15 年前

    我正在尝试为流文件实现IHttphandeler。文件可能是小缩略图或大电影
    存储在SQL Server中的二进制文件r
    我在网上看了很多代码,但有些东西没有意义
    流媒体不应该逐个读取数据并将其移动到行上吗?
    大多数代码似乎首先将整个字段从MSSQL读取到内存,然后使用流式处理进行输出写入。
    从磁盘直接流到HTTP字节(或缓冲块)不是更有效吗?
    这是我目前为止的代码,但还不能找出sqlreader模式、流对象和写入系统的正确组合。

    Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
         context.Response.BufferOutput = False
        Dim FileField=safeparam(context.Request.QueryString("FileField"))
         Dim FileTable=safeparam(context.Request.QueryString("FileTable"))
         Dim KeyField=safeparam(context.Request.QueryString("KeyField"))
         Dim FileKey=safeparam(context.Request.QueryString("FileKey"))                 
        Using connection As New SqlConnection(ConfigurationManager.ConnectionStrings("Main").ConnectionString)
            Using command As New SqlCommand("SELECT " & FileField & "Bytes," & FileField & "Type FROM " & FileTable & " WHERE " & KeyField & "=" & FileKey, connection)
                command.CommandType = Data.CommandType.Text
    

    最终使用 最终使用 结束子

    请注意,此SQL命令还返回查询第二个字段中的文件扩展名(pdf、jpg、doc…)。

    非常感谢大家

    编辑:

    我设法找到了更多的代码,现在页面间歇性地出现了。有时它会带来PDF文件,有时它不会
    我不明白这里的模式
    我认为主要的问题是当请求来自不同的页面,我单击“在新标签中显示”,然后它就不起作用了。当我做“在新窗口中显示”时,它基本上是有效的,但并不总是有效。
    顺便说一句,代码总是运行的。决不犯错或类似的事情。每次请求都像个好孩子一样从头到尾
    有时,IE在很长一段时间后,会给我一条消息(从新标签中),“Adobe/Acrobat Reader有问题。请退出Adobe Acrobat/Reader并重试。“
    怎么了?
    这是我的当前代码

    Shared Sub ProccessMedia(ByVal context As HttpContext)
        If CurPerson Is Nothing OrElse Not CurPerson.PersonExts.FirstOrDefault.LetAllFiles Then Exit Sub
        context.Response.BufferOutput = False
        Dim FileField = SafeParam(context.Request.QueryString("FileField"))
        Dim FileTable = SafeParam(context.Request.QueryString("FileTable"))
        Dim KeyField = SafeParam(context.Request.QueryString("KeyField"))
        Dim FileKey = SafeParam(context.Request.QueryString("FileKey"))
        Dim oSqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("Main").ConnectionString)
        Dim oSqlCommand = New SqlCommand("SELECT " & FileField & "Type," & FileField & "Bytes FROM " & FileTable & " WHERE " & KeyField & "=" & FileKey, oSqlConnection)
        oSqlConnection.Open()
        Dim oSqlDataReader = oSqlCommand.ExecuteReader(CommandBehavior.SequentialAccess)
        If oSqlDataReader.Read() Then
            context.Response.ContentType = GetMIMEType(oSqlDataReader.GetString(0))
            Dim bufferSize = 8040
            Dim chunk = New Byte(bufferSize - 1) {}
            Dim retCount As Long
            Dim startIndex As Long = 0
            retCount = oSqlDataReader.GetBytes(1, startIndex, chunk, 0, bufferSize)
            While retCount = bufferSize
                context.Response.BinaryWrite(chunk)
                startIndex += bufferSize
                retCount = oSqlDataReader.GetBytes(1, startIndex, chunk, 0, bufferSize)
            End While
            oSqlDataReader.Close()
            oSqlConnection.Close()
            Dim actualChunk = New Byte(retCount - 2) {}
            Buffer.BlockCopy(chunk, 0, actualChunk, 0, CInt(retCount) - 1)
            context.Response.BinaryWrite(actualChunk)
        End If
    End Sub
    

    非常感谢你

    1 回复  |  直到 14 年前
        1
  •  0
  •   Yisroel M. Olewski    14 年前

    间歇停止了。不知道为什么。

    但现在工作正常了

    推荐文章