Как показать диалог загрузки до того, как файл будет готов к загрузке? - PullRequest
2 голосов
/ 13 августа 2011

Я получаю файл из базы данных в формате byte [] и хочу, чтобы пользователь увидел диалог загрузки, прежде чем Linq возьмет его из базы данных. Это в C # и ASP.NET.

Теперь это так:

  1. Пользователь выбирает файл, нажимает на него.
  2. В коде я получаю идентификатор кликаемого файла и использую Linq, который я скачиваю.
  3. Затем я отправляю файл по Response.OutputStream.Write (content, 0, content.Length);
  4. Перед загрузкой файла из базы данных пользователь не увидит диалог загрузки.

Что я могу сделать, если я хочу, чтобы пользователи видели диалог загрузки перед загрузкой файла?

Код:
Получение файла по id:

public static byte[] getFile(Guid id)
{
    var linqFile =  from file in MyDB.Files
                    where file.IdPliku.Equals(id)
                    select new
                    {
                        Content = file.Content
                    };

     return linqFile.ToList().FirstOrDefault().Content.ToArray();
}

Сохранение файла:

public void SaveFile(Guid fileID, string filename, string mimeTypes)
{
    try
    {
        byte[] content = FileService.getFile(fileID);
        Response.ClearContent();
        Response.ClearHeaders();
        Response.ContentType = mimeTypes;
        Response.AppendHeader("Accept-Ranges", "bytes");
        Response.AppendHeader("Content-Range", string.Format("0-{0}/{1}", content.Length, content.Length));
        Response.AppendHeader("Content-Length", content.Length.ToString());
        Response.AppendHeader("Content-Encoding", "utf-8");
        Response.AppendHeader("Content-Type", Response.ContentType);
        Response.AppendHeader("Content-Disposition", "attachment; filename= " + HttpUtility.UrlEncode(filename));
        Response.OutputStream.Write(content, 0, content.Length);
        //Response.BinaryWrite(content);
        Response.Flush();
    }
    finally
    {
        Response.Close();
    }
}

Ты моя надежда.

1 Ответ

1 голос
/ 13 августа 2011

Ваша проблема здесь:

byte[] content = FileService.getFile(fileID);

потому что в этой строке вы распределяете весь файл в оперативной памяти веб-сервера и помещаете туда все, все содержимое файла из базы данных; то, что происходит позже, больше не имеет значения, потому что вы уже скачали с БД на веб-сервер в этой строке !!!

У меня такая дежа-вю, потому что я уверен, что дал тот же самый комментарий к тому же вопросу несколько недель назад. Не могу найти его сейчас, поищите что-то подобное здесь в SO.

На самом деле решение состоит в том, чтобы направлять поток непосредственно в выходной поток Response, избегая выделения массива byte [] выше, чтобы получить этот уровень данных, он, конечно, должен его поддерживать, а если нет, вы можете добавить метод для этого , Вы хотите использовать файловый поток SQL Server или что-то подобное.

...