Получить двоичные данные из базы данных SQL - PullRequest
1 голос
/ 27 октября 2008

У меня есть веб-сайт 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 ]

1 голос
/ 27 октября 2008

Так вы действительно только после того, как обслуживать байтовый массив в ASP.NET? Похоже, что часть базы данных не имеет значения, учитывая, что вы сказали, что можете получить двоичный файл с запросом LINQ.

Если это так, посмотрите на HttpResponse.BinaryWrite . Вы также должны установить тип содержимого ответа, например, применение / PDF.

0 голосов
/ 14 апреля 2009

Когда вы храните двоичные файлы в 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 для выполнения операций ввода-вывода для байта [].

Надеюсь, это поможет ..

Ручит С.

0 голосов
/ 27 октября 2008

защищенный void Test_Click (отправитель объекта, 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);" Я не уверен, где я иду не так, это из-за того, как я его хранил?

0 голосов
/ 27 октября 2008

Насколько большие файлы? Огромные буферы (например, byte [fileLength]) обычно плохая идея.

Лично я бы посмотрел на такие вещи, как , это и , это , которые показывают чтение / запись данных в виде потоков (вторая показывает подталкивание потока в качестве ответа http). Но обновлено использование varchar (max); -p

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...