Я просто сохраняю загруженный файл в двоичное поле в SQL Server, но также мне нужно разрешить пользователям загружать его с помощью Asp.NET. Как я могу это сделать ?Как загрузить файл, хранящийся в SQL DB в двоичном формате
Заранее спасибо.
Я просто сохраняю загруженный файл в двоичное поле в SQL Server, но также мне нужно разрешить пользователям загружать его с помощью Asp.NET. Как я могу это сделать ?Как загрузить файл, хранящийся в SQL DB в двоичном формате
Заранее спасибо.
Here's a Microsoft Knowledge Base article on this.
Как восстановить файл из базы данных зависит от используемой технологии доступа к данным; Я просто предполагаю, что у вас есть массив байтов 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, чтобы создать файл ... что-то вроде этого:
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\"");
Тогда как я могу получить расширение из двоичных данных? – Tarik
И вы могли бы предоставить пример кода, потому что я как бы знал, что вы сказали, но с кодовой стороны мне может понадобиться пример :( – Tarik
нет способа сделать это. Лучшим способом было бы сохранить расширение в базе данных. –