我正在使用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一样。
答案 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以便给用户带来良好的体验。