下载前,在浏览器的新选项卡中预览数据库中的二进制数据

时间:2014-12-18 09:05:01

标签: c# asp.net

我正在使用ASP.NET C#中的代码,我可以从数据库中检索二进制数据,也可以在点击时下载它。现在我想在下载之前预览这些数据,无论是doc,pdf,image还是浏览器中新标签中的任何格式,就像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一样。

2 个答案:

答案 0 :(得分:0)

您在控制器中写入的方式将始终强制下载。您可以创建第二个页面,而不必通过标题强制下载,而是“显示”内容并添加一个调用您创建的方法的下载按钮。

但是正如一些评论者已经说过的那样,虽然它适用于图像,但根据浏览器和安装的软件,你不能“预览”pdfs ord docs,因为一些已安装的程序接管了。

一种解决方案可能是为每个条目添加描述/预览图像,并将其与下载按钮一起显示。

答案 1 :(得分: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 literal控制。后面的代码将使用它来渲染您的预览。

在你的代码中,查询你的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以便给用户带来良好的体验。