Entity Framework 4 и sql filestream для чтения файла из БД - PullRequest
1 голос
/ 16 сентября 2010

Я использую ASP.NET 4, EF 4 и FILESTREAM в SQL 2008 для добавления / чтения файлов в БД.Я могу загружать файлы просто отлично, но я не могу получить файлы так, как я хочу.Вот что я делаю -

  1. У меня есть сетка, которая отображает список файлов.Каждый элемент строки представляет собой файл с установленными CommandName и CommandArgument.
  2. Пользователь нажимает на любой из этих файлов, и я фиксирую это событие в событии RowCommand.На этом этапе я получаю идентификатор файла и извлекаю байт [] из БД.Как отобразить стандартное окно загрузки для пользователя, чтобы сохранить или отменить загрузку?

Я могу записать поток во временный файл (используя System.IO.File.WriteAllBytes), а затем выполнитьServer.Transfer для временного файла, но я думаю, что это ненужный шаг.Есть ли способ, я могу прочитать байты непосредственно в память, затем установить ContentType / MimeType и позволить пользователю сохранить файл?

Я понимаю, что доступ к файлу FILESTREAM с помощью T-SQL медленнее, чем доступто же самое с использованием WIN32 API (с использованием комбинации новых SystemFile.PathName () и Impersonation), но EF4 ускоряет работу с SQL, поэтому я иду по этому маршруту.

Вот код -

var file = db.Storage.Single(f => f.ID.Equals(fileID)); // fileID is set in CommandArgument
// file.Contents has the byte [].
// display a  standard file download box.

Спасибо за любую помощь!

1 Ответ

1 голос
/ 16 сентября 2010

Возможно, вы хотите создать .ashx hanlder (при условии, что вы используете asp) и Server.Transfer () или Server.Redirect () для этого URL.

В качестве альтернативы, вы можете изменить GridView для отображения гиперссылки на URL обработчика.

Щелкните правой кнопкой мыши в обозревателе решений> Новый элемент> ASP.Net Hanlder.

Код для обработчика:

public class DownloadFile : IHttpHandler { // add IRequiresSessionState if needed 
  public bool IsReusable { get { return true; } }

  public void ProcessRequest(HttpContext context) {
    var fileID = context.Request.QueryString["fileID"]; // assuming fileID is a string
    var file = db.Storage.Single(f => f.ID.Equals(fileID)); 
    // set the content type
    context.Response.OutputStream.Write(file.Contents, 0, file.Contents.Length);
  }
}

Возможно, вы также захотите добавить проверку ошибок.

Ваш URL будет выглядеть примерно так: /DownloadFile.ashx?fileID=somefileid

...