2010-05-30 3 views
0

Я пытаюсь реализовать ihttphandeler для потоковой передачи файлов. Файлы могут быть крошечные миниатюры или гигантские фильмы
двоичные файлы ¨R хранятся в SQL сервере
я просмотрел много кода в Интернете, но что-то не имеет смысла
не потоковая должен прочитать часть данных по частям и переместить его над линией?
Большая часть кода, кажется, сначала прочитала все поле из mssql в память, а затем использовала потоковое воспроизведение для вывода
не было бы более эффективным для фактического потока с диска напрямую на http byte by byte (или буферизованные куски?)
Heres мой код до сих пор, но не могу понять, правильное сочетание режима sqlreader и потоковый объект и систему письма.net IHTTPHandler Streaming SQL двоичные данные

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 

конца, используя конец, используя End Sub

следует помнить, что это Команда SQL возвращает также расширение файла (PDF, JPG, DOC ...) во втором поле запроса

спасибо всем большое

EDIT:

мне удалось найти некоторые больше кода, и теперь страница отображается с перерывами. иногда он приносит файл pdf, а иногда он не
Я не могу понять шаблон здесь
Я думаю, что основная проблема заключается в том, когда запрос с другой страницы, и я нажимаю «показать на новой вкладке», тогда он никогда не работал , когда я «показываю в новом окне», он работает, но не всегда.
кстати. запускается код «ВСЕГДА». никогда не ломается, ошибок или чего-либо подобного. он работает как хороший мальчик от начала до конца по каждому запросу
иногда IE после долгого времени дает мне сообщение (с новой вкладки) «Существует проблема с читателем Adobe/Acrobat. Выйдите из Adobe Acrobat/Reader и попробуй еще раз."
что может быть?
Heres мой текущий код

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 

спасибо

ответ

0

intermittance остановился. не знаю почему.

, но теперь его работаю ОК