Я просто храню загруженный файл в двоичное поле в SQL Server, но я также должен позволить пользователям загружать его Asp.NET. Как я могу сделать это?
Заранее спасибо.
Вот статья базы знаний 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, чтобы ваш код знал, какой файл получить из базы данных.
Считайте данные в объект файлового потока с соответствующим расширением, прикрепленным к нему, и попросите пользователя загрузить полученный файл.
Вы захотите использовать объект System.IO BinaryWriter в файловом потоке для создания файла ... что-то вроде этого:
FileStream fs = new FileStream("thisfile.bin", FileMode.Create);
binWriter= new BinaryWriter(fs);
binWriter.Write(varHoldingSqlRetrievedBinaryData);
Добавьте страницу общего обработчика (.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\"");