0

私がここにいるのは久しぶりです。添付ファイルが DB に保存される ASP プロジェクトに取り組んできました。テーブルに格納されているバイトをファイルに取得しようとしています。ファイルは作成できましたが、テーブルからバイトを取得できませんでした。

これは、ファイルをテーブルに入力するコードです。

'Saves the upload file data to database for the using Request_ID after the request has been created
    strFileName = FileUploadReqDtl.FileName
    strFileExt = strFileName.Substring(strFileName.IndexOf(".") + 1)
    intFileSize = FileUploadReqDtl.PostedFile.ContentLength()

    Dim theDataSize As Byte() = New Byte(FileUploadReqDtl.PostedFile.ContentLength - 1) {}
    Dim uploadedFile As HttpPostedFile = FileUploadReqDtl.PostedFile
    Dim theData = uploadedFile.InputStream.Read(theDataSize, 0, CInt(FileUploadReqDtl.PostedFile.ContentLength))

別の ASP ページに移動し、ファイルをダウンロード可能にしようとするページにリンクを作成することができました。テーブルからレコードを取得するために SQL が適切に機能していることはわかっていますが、バイトを適切に取得できません。

        If (dr.HasRows = True) Then
            While dr.Read()
                ' Casting the value returned by the datareader to the byte[] data type.
                result = CType(dr.GetValue(0), Byte())
                strFileName = dr.GetString(1)
                Debug.Write("strFileName: " & strFileName & vbCrLf)
            End While
        End If
        dr.Close()
        cnToDb.Close()
        ShowFile(strFileName, result, MimeType)
    Catch ex As Exception
        MsgBox("Uh oh, I couldn't get the attachment!")
        Debug.Write("Uh oh, I couldn't get the attachment!")
        Debug.Write(ex.Message & " - " & ex.StackTrace & vbCrLf & vbCrLf)
        result = Nothing
    End Try

これは、データベースからのバイトを使用して最終的に「ファイルを作成」​​する ShowFile 関数です。

    Dim fileData() As Byte
    fileData = byteFileData

    Response.Clear()
    Response.AddHeader("Content-Disposition", "attachment; filename=" + strFileName)
    Response.ContentType = MimeType
    Response.BinaryWrite(fileData)
    Response.End()
    Response.Flush()

私が問題を抱えている例外は次のとおりです。

    SQL: SELECT Data, FileName FROM tblFileUploadData WHERE Report_ID =
116

strFileName: TheAwesomeAttachment.txt A first chance exception of type
'System.Threading.ThreadAbortException' occurred in mscorlib.dll Uh
oh, I couldn't get the attachment!Thread was being aborted. -    at
System.Threading.Thread.AbortInternal()    at
System.Threading.Thread.Abort(Object stateInfo)    at
System.Web.HttpResponse.End()    at
WebApplication3.WebForm2.ShowFile(String strFileName, Byte[]
byteFileData, String MimeType) in C:\Users\Mike\documents\visual
studio
2010\Projects\WebApplication3\WebApplication3\Attachment.aspx.vb:line
81    at WebApplication3.WebForm2.getAttachment(Int32 RequestID,
String MimeType) in C:\Users\Mike\documents\visual studio
2010\Projects\WebApplication3\WebApplication3\Attachment.aspx.vb:line
56

A first chance exception of type
'System.Threading.ThreadAbortException' occurred in
WebApplication3.DLL An exception of type
'System.Threading.ThreadAbortException' occurred in
WebApplication3.DLL but was not handled in user code The thread '<No
Name>' (0x728) has exited with code 0 (0x0). The program '[13512]
WebDev.WebServer40.EXE: Managed (v4.0.30319)' has exited with code 0
(0x0). The program '[13512] WebDev.WebServer40.EXE: Program Trace' has
exited with code 0 (0x0).
4

1 に答える 1

1

を見てみましょう:

http://support.microsoft.com/kb/312629

「Response.End については、Response.End の代わりに HttpContext.Current.ApplicationInstance.CompleteRequest メソッドを呼び出して、コード実行を Application_EndRequest イベントにバイパスします」

このような状況では、.ashx ファイルを作成するのが好きです。リンクすると、ページを表示せずにファイルがダウンロードされます。

Public Class DownloadFile
Implements System.Web.IHttpHandler

Public Sub ProcessRequest(context As HttpContext) Implements IHttpHandler.ProcessRequest

    Try

        Dim id As String = context.Request.QueryString("id")

        Dim filename As String = ""

        Dim output As Byte()

        filename = ServiceHelper.GetFilenameByID(id)

        output = ServiceHelper.GetFileBytesByID(id)

        Dim ext As String = System.IO.Path.GetExtension(filename)
        Dim contenttype As String

        'clear the current output content from the buffer
        context.Response.Clear()
        'add the header that specifies the default filename for the
        'Download/SaveAs dialog

        context.Response.AddHeader("Content-Disposition", "attachment; filename=" & filename)

        'add the header that specifies the file size, so that the browser
        'can show the download progress
        context.Response.AddHeader("Content-Length", output.Length.ToString())
        'specify that the response is a stream that cannot be read by the
        'client and must be downloaded
        'Response.ContentType = "application/octet-stream"

        context.Response.Buffer = True

        Select Case ext
            Case ".doc"
                contenttype = "msword"
            Case ".pdf"
                contenttype = "pdf"
            Case ".xls"
                contenttype = "x-excel"
            Case ".ppt"
                contenttype = "ms-powerpoint"
            Case Else
                contenttype = "octet-stream"
        End Select

        context.Response.ContentType = "application/" & contenttype
        context.Response.BinaryWrite(output)

        'http://support.microsoft.com/kb/312629
        'context.Response.End()
        context.ApplicationInstance.CompleteRequest()

    Catch
    End Try

End Sub

Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
    Get
        Return False
    End Get
End Property

End Class
于 2012-12-09T15:20:08.517 に答える