从SQL数据库获取二进制数据

时间:2008-10-27 15:07:49

标签: c# .net linq pdf

我有一个ASP .Net(3.5)网站。我有以下代码将文件作为二进制文件上传到SQL数据库:

Print("        
            protected void UploadButton_Click(object sender, EventArgs e)
            {

            //Get the posted file
            Stream fileDataStream = FileUpload.PostedFile.InputStream;

            //Get length of file
            int fileLength = FileUpload.PostedFile.ContentLength;

            //Create a byte array with file length
            byte[] fileData = new byte[fileLength];

            //Read the stream into the byte array
            fileDataStream.Read(fileData, 0, fileLength);

            //get the file type
            string fileType = FileUpload.PostedFile.ContentType;

            //Open Connection
            WebSysDataContext db = new WebSysDataContext(Contexts.WEBSYS_CONN());

            //Create New Record
            BinaryStore NewFile = new BinaryStore();

            NewFile.BinaryID = "1";
            NewFile.Type = fileType;
            NewFile.BinaryFile = fileData;

            //Save Record
            db.BinaryStores.InsertOnSubmit(NewFile);

            try
            {
                db.SubmitChanges();
            }
            catch (Exception)
            {
                throw;
            }
        }");

将上传的文件是PDF,您能否帮我编写代码以将PDF从SQL数据库中取出并在浏览器中显示。 (我能够使用linq查询获取二进制文件,但不知道如何处理字节)

4 个答案:

答案 0 :(得分:1)

那么你真的只是在如何在ASP.NET中提供字节数组吗?这听起来像数据库部分是无关紧要的,因为您已经说过能够使用LINQ查询获取二进制文件。

如果是,请查看HttpResponse.BinaryWrite。您还应该适当地设置响应的内容类型,例如应用/ PDF。

答案 1 :(得分:0)

文件有多大?巨大的缓冲区(即byte [fileLength])通常是个坏主意。

就个人而言,我会查看thisthis之类的内容,它们将读取/写入数据显示为流(第二个显示将流推送为http响应)。但更新为使用varchar(max);-p

答案 2 :(得分:0)

protected void Test_Click(object sender,EventArgs e)         {

        WebSysDataContext db = new WebSysDataContext(Contexts.WEBSYS_CONN());

        var GetFile = from x in db.BinaryStores
                      where x.BinaryID == "1"
                      select x.BinaryFile;

        FileStream MyFileStream;
        long FileSize;

        MyFileStream = new FileStream(GetFile, FileMode.Open);
        FileSize = MyFileStream.Length;

        byte[] Buffer = new byte[(int)FileSize];
        MyFileStream.Read(Buffer, 0, (int)FileSize);
        MyFileStream.Close();

        Response.Write("<b>File Contents: </b>");
        Response.BinaryWrite(Buffer);

    }

我尝试了这个并没有用。我在这行“MyFileStream = new FileStream(GetFile,FileMode.Open);”中遇到编译错误。 我不知道我哪里出错了,是不是因为我存储它的方式?

答案 3 :(得分:0)

在SQL Server中存储二进制文件时,它会向二进制数据添加OLE标头。因此,在将byte []实际读入文件之前,必须先删除该标题。这是你如何做到的。

// First Strip-Out the OLE header
const int OleHeaderLength = 78;

int strippedDataLength = datarow["Field"].Length - OleHeaderLength;

byte[] strippedData = new byte[strippedDataLength];

Array.Copy(datarow["Field"], OleHeaderLength, 
    strippedData , 0, strippedDataLength );

运行此代码后,strippedData将包含实际的文件数据。然后,您可以使用MemoryStream或FileStream在byte []上执行I / O.

希望这会有所帮助..

Ruchit S。