2009-12-14 2 views

ответ

7

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, чтобы ваш код знал, какой файл нужно получить из базы данных.

3

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

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

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

binWriter.Write(varHoldingSqlRetrievedBinaryData); 
+0

Тогда как я могу получить расширение из двоичных данных? – Tarik

+0

И вы могли бы предоставить пример кода, потому что я как бы знал, что вы сказали, но с кодовой стороны мне может понадобиться пример :( – Tarik

+0

нет способа сделать это. Лучшим способом было бы сохранить расширение в базе данных. –

2

Добавьте общий веб-сайт (.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\""); 
Смежные вопросы