我们有一个winform应用程序,它有一个浏览器控件。以前这些文件(总是非常小的10kb等)存储在unc位置。我们将生成一些html并将html加载到浏览器中。如果我们想让这些小文件中的一个可用,我们将在HTML中包含一个锚标记()当html在浏览器控件中显示时,这就是链接。用户可以单击该链接并显示文件另存为对话框。
我们现在将这些文件作为varbinary存储在db中,因此不再有锚标记指向的物理位置。我有几个想法,但希望那些比我聪明的SO成员能够加入。
在我看来,选项1将是一个图像按钮,锚标签,点击html中的内容。我会用javascript或回发来处理“onclick”。这似乎可以用于我的知识水平除了我不知道如何将byte []转换为用户的另存为对话框....我是否先将其渲染到磁盘?
我的另一个想法是在浏览器控件中有一个 NOT 按钮。如果商业规则表示显示文件,则此按钮将隐藏/可见。单击该按钮将生成byte [],该字节很容易转换为文件,并在winform应用程序中显示如图所示的保存对象。
所以任何想法或所有不同的建议都欢迎 TIA JB
答案 0 :(得分:1)
我了解您可以控制Windows窗体Web浏览器控件中显示的ASP.NET网页,以便您可以编辑该页面并按照您希望的方式构建它。
如果这是真的,托管网页浏览器或正常IE会话中的行为是相同的,我建议在asp.net网页表单页面中创建一堆超链接或按钮,每一个都有一个特定的ID,如要下载的文件的ID。然后你可以创建一个处理程序或button_click事件处理程序,你可以通过点击的按钮/链接相关文件Id获取文件的byte [],或者如果你启动了一个处理程序调用,则从查询字符串获取,然后你开始向下流式传输浏览器的文件内容,浏览器将完成您所需要的一切。
例如,作为一个起点,从这里获取一些代码:http://social.msdn.microsoft.com/Forums/en-US/silverlightnet/thread/d6a5087f-43b1-4782-95f1-d1376130d2c8
向您展示了从页面加载中执行此操作的可能方法,诀窍是对GetDocument
的调用为您获取了正确的文件内容(在本例中来自查询字符串,想象就像我们在里面处理程序处理方法)并返回包含字节的类DocumentInfo
。你不需要这个DocumentInfo,你可以有一个按文件ID返回byte[]
的方法,例如......
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
string queryString = this.Request.QueryString.ToString();
if (string.IsNullOrEmpty(queryString)) return;
DocumentInfo documentInfo = GetDocument(queryString);
if (!documentInfo.HasValue) return;
Response.ClearHeaders();
Response.ClearContent();
Response.AppendHeader("Content-Length", documentInfo.Value.Content.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment; filename=Test.doc");
Response.BinaryWrite(documentInfo.Value.Content);
Response.End();
}
}