То, как Загрузить файл, сохранило в SQL DB в Двоичном формате

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

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

6
задан Tarik 14 December 2009 в 17:55
поделиться

3 ответа

Вот статья базы знаний Microsoft по этому поводу.

Как получить файл из вашей базы данных, зависит от используемой вами технологии доступа к данным; Я просто предполагаю, что у вас есть некоторый массив байтов 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, чтобы ваш код знал, какой файл получить из базы данных.

7
ответ дан 9 December 2019 в 20:44
поделиться

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

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

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

binWriter.Write(varHoldingSqlRetrievedBinaryData);
3
ответ дан 9 December 2019 в 20:44
поделиться

Добавьте страницу общего обработчика (.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\"");
2
ответ дан 9 December 2019 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: