0

我正在尝试为流文件实现 ihttphandeler。文件可能是微小的缩略图或巨大的电影
存储在 sql server 中的二进制文件
我在网上查看了很多代码,但有些东西没有意义
是不是流式传输不应该逐个读取数据并将其移动到线上?
大多数代码似乎首先将整个字段从 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 阅读器有问题。请退出 Adob​​e 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

非常感谢你

4

1 回答 1

0

间歇已经停止。不知道为什么。

但现在它工作正常

于 2010-11-29T16:04:31.110 回答