Как скачать файл, хранящийся в БД SQL в двоичном формате - PullRequest
6 голосов
/ 14 декабря 2009

Я просто сохраняю загруженный файл в двоичном поле в SQL Server, но мне также нужно разрешить пользователям загружать его с помощью Asp.NET. Как я могу это сделать?

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 14 декабря 2009

Вот статья базы знаний Майкрософт по этому вопросу.

Способ получения файла из вашей базы данных зависит от используемой вами технологии доступа к данным; Я просто предположу, что у вас есть некоторый байтовый массив data, содержащий файл (например, путем заполнения DataSet и доступа к полю) и некоторую строку filename.

Response.Clear()
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Disposition", "attachment;filename=""" & filename & """")
Response.BinaryWrite(data)
Response.End()

Поместите приведенный выше код в download.aspx и укажите ссылку на этот файл. Возможно, вы захотите передать некоторую информацию строки запроса в ваш файл download.aspx, чтобы ваш код знал, какой файл получить из базы данных.

3 голосов
/ 14 декабря 2009

Считайте данные в объект файлового потока с соответствующим расширением, прикрепленным к нему, и попросите пользователя загрузить полученный файл.

Вы захотите использовать объект System.IO BinaryWriter в файловом потоке для создания файла ... примерно так:

FileStream fs = new FileStream("thisfile.bin", FileMode.Create);
binWriter= new BinaryWriter(fs);    

binWriter.Write(varHoldingSqlRetrievedBinaryData);
2 голосов
/ 14 декабря 2009

Добавьте страницу универсального обработчика (.ashx) на свой веб-сайт. В приведенном ниже тексте кода Ashx показано, как прочитать произвольный поток (в данном случае файл PNG с диска) и записать его в ответ:

using System;
using System.Web;
using System.IO;

namespace ASHXTest
{
    public class GetLetter : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            // Get letter parameter from query string.
            string fileName = context.Request.MapPath(string.Format("{0}.png",
                context.Request.QueryString["letter"]));

            // Load file from disk/database/ether.
            FileStream stream = new FileStream(fileName, FileMode.Open,
                FileAccess.Read);
            byte[] buffer = new byte[stream.Length];
            stream.Read(buffer, 0, buffer.Length);
            stream.Close();

            // Write response headers and content.
            context.Response.ContentType = "image/png";
            context.Response.OutputStream.Write(buffer, 0, buffer.Length);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

При желании вы также можете установить заголовок Content-Disposition, как показано в ответе Хайнци:

context.Response.AddHeader("Content-Disposition",
    "attachment;filename=\"letter.png\"");
...