0

我们有一个带有浏览器控件的 winform 应用程序。以前这些文件(总是非常小的 10kb 等)存储在 unc 位置。我们将生成一些 html 并将 html 加载到浏览器中。如果我们想让这些小文件之一可用,我们将在 HTML 中包含一个锚标记 () 当 html 显示在浏览器控件中时,链接也会显示。用户可以单击链接,将出现文件另存为对话框。

我们现在将这些文件作为 varbinary 存储在数据库中,因此不再有锚标记指向的物理位置。我有几个想法,但希望比我聪明得多的 SO 成员插话。

在我看来,选项 1 是在 html 中添加一个图像按钮、锚标记、可单击的内容。我会在 javascript 中或作为回发处理“onclick”。这对于我的知识水平似乎是可行的,除了我不知道如何将字节 [] 转换为用户的另存为对话框......我是否先将其渲染到磁盘?

我的另一个想法是有一个不在浏览器控件中的按钮。如果 biz 规则要求显示文件,则此按钮将隐藏/可见。单击该按钮将生成 byte[],它很容易变成一个文件,并保存为 winform 应用程序中显示的对话框。

所以任何想法或所有不同的建议都欢迎TIA JB

4

1 回答 1

1

我了解您可以控制 Windows 窗体 Web 浏览器控件中显示的 ASP.NET 网页,因此您可以编辑该页面并按照您想要的方式构建它。

如果这是真的,托管网络浏览器或普通 IE 会话中的行为是相同的,我建议在 asp.net 网页表单页面中创建一堆超链接或按钮,每个都有一个特定的 ID,比如 ID要下载的文件。然后您可以创建一个处理程序或 button_click 事件处理程序,您可以在其中通过单击的按钮/链接关联的文件 ID 获取文件的字节 [],或者如果您启动了处理程序调用,则从查询字符串中获取文件的字节 [],然后开始向下流式传输到浏览文件内容,浏览器会为你做所有需要的事情。

例如,作为起点,从这里获取的一些代码:http: //social.msdn.microsoft.com/Forums/en-US/silverlightnet/thread/d6a5087f-43b1-4782-95f1-d1376130d2c8

向您展示了一种从页面加载中执行此操作的可能方法,诀窍是调用为GetDocument您获取正确的文件内容(在这种情况下来自查询字符串,想象一下如果我们在处理程序处理方法中)并返回一个DocumentInfo包含字节的类。你也不需要这个 DocumentInfo,你可以有一个方法,byte[]例如通过 File Id 返回...

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();
    }
}
于 2013-04-09T23:46:53.293 回答