Предварительный просмотр двоичных данных из базы данных в новой вкладке браузера перед загрузкой

1

Я работаю над кодом в ASP.NET С#, где я могу получить двоичные данные из базы данных, а также загрузить его по клику. Теперь я хочу просмотреть эти данные в формате doc, pdf, изображения или в любом формате на новой вкладке в браузере, как и gmail, перед загрузкой. Я пробовал много кодов, но не смог добиться именно того, что желаю. Мой код для загрузки выглядит так:

 public void DownloadFile(string FileName, string message_id)
{
    byte[] bytes;
    string fileName, contentType;

    Session["message_id"] = message_id;
    con.Close();
    con.Open();
    SqlCommand com = new SqlCommand("SELECT * from FilesContent where (FileName='" + FileName + "' AND message_id='" + message_id + "')", con);

    using (SqlDataReader sdr = com.ExecuteReader())
    {
        sdr.Read();
        bytes = (byte[])sdr["FileContent"];
        contentType = sdr["FileExtension"].ToString();
        fileName = sdr["FileName"].ToString();
    }
    con.Close();
    Response.Clear();
    Response.Buffer = true;
    Response.Charset = "";
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.ContentType = "application/octet-stream";
    Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
    Response.BinaryWrite(bytes);

}

Во-вторых, я попытался поместить этот код загрузки в событие загрузки страницы на новую страницу с именем "ViewFiles.aspx" и попытался перенаправить эту страницу на новую вкладку, используя следующий код:

 Response.Write("<script> window.open( '" + "ViewFiles.aspx" + "','_blank' ); </script>");
    Response.End();

Но я не могу достичь того, чего хочу. Я хочу, чтобы этот двоичный файл из базы данных преобразовывался в любой формат, и его нужно предварительно просмотреть в браузере, как и gmail перед загрузкой.

  • 1
    То, как вы пишете свою команду SQL ("FileName = '" + FileName + "' AND message_id = '" + message_id + "'"), очень рискованно и может быть открыто для атак с использованием SQL-инъекций. Вместо этого используйте параметры команды SQL
  • 0
    Огромное спасибо. Конечно, я изменю это! Благодарю.
Показать ещё 4 комментария
Теги:

2 ответа

0
Лучший ответ

То, как вы пишете в своем контроллере, всегда будет принудительно загружать. Вы можете создать вторую страницу без того, где вы не принудительно загружаете через заголовки, а вместо этого "отображаете" содержимое и добавляете кнопку загрузки, вызывающую метод, который вы создали.

Но, как уже отмечали некоторые комментаторы, в то время как он работает с изображениями, в зависимости от браузера и установленного программного обеспечения, вы не можете "просматривать" pdfs ord docs, поскольку сработала какая-то установленная программа.

Одним из решений может быть добавление описания/предварительного просмотра в каждую запись и отображение, которое вместе с кнопкой загрузки.

0

Способ сделать это - написать собственную страницу предварительного просмотра. На вашей странице, где пользователь может выбрать файл для предварительного просмотра, должны быть ссылки, например:

<a href="preview.aspx?id=1" target="_blank">File1.jpg</a>
<a href="preview.aspx?id=2" target="_blank">File2.jpg</a>
<a href="preview.aspx?id=3" target="_blank">File3.png</a>

Теперь ваша страница preview.aspx должна просто иметь литеральный элемент управления ASP.NET в форме. Код позади будет использовать это для рендеринга вашего предварительного просмотра.

В своем коде позади запросите свой SQL-сервер и выясните, какой он файл. Вы можете понять, какой файл он имеет, либо глядя на расширение, и на получение типа MIME, либо на метод "магических чисел".

Как только вы узнаете, какой именно файл, создайте предварительный резерв, подходящий для такого типа файлов. Например, если это файл изображения, ваш код может выглядеть так:

private void CreatePreview(string mimeType, string file)
{
    if (mimeType.ToLower() == "image/jpeg" || mimeType.ToLower() == "image/png")
    {
        literal1.Text = literal1.Text + "<img src=\"" + file + "\" />";
    }
}

Если файл является текстовым файлом, ваш код может выглядеть так:

private void CreatePreview(string mimeType, string file)
{
    if (mimeType.ToLower() == "image/jpeg" || mimeType.ToLower() == "image/png")
    {
        literal1.Text = literal1.Text + "<img src=\"" + file + "\" />";
    } else if (mimeType.ToLower() == "text/plain")
    {
        literal1.Text = literal1.Text + HttpUtility.HtmlEncode(File.ReadAllText(file));
    }
}

Надеюсь, вы получите эту идею! Вы не захотите напрямую использовать этот код, как это. Вы захотите это сделать и сделать Ajax-ify, чтобы дать пользователю хороший опыт.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню