使用 asp.net 网络表单 Gridview 从 SQL 数据源下载文件

Download file from SQL data source using asp.net web forms Gridview

我正在使用 Telerik RadGrid 控件,并根据其文档中的建议使用 GridAttachmentColumn 来下载文件,但我发现缺少一些东西,也许是一些代码隐藏?文档讨论禁用 Ajax 文件上传和导出但不下载?

SQL table 包含这些文件存储在网络共享中的 UNC 路径。 'download'栏指向右边data\location,文件路径变成超链接,点击后没有动作

我也尝试过使用超链接栏,它似乎在 IE 上部分有效,但在 Chrome 上无效。部分原因是下载了一些文件,并在屏幕上呈现了一些文件。我需要使用适用于两种浏览器的解决方案来下载它们。

这是网格代码:

 <telerik:RadGrid ID="RadGrid1" runat="server" DataSourceID="SqlDataSource1" Skin="WebBlue" AllowPaging="True">
<GroupingSettings CollapseAllTooltip="Collapse all groups"></GroupingSettings>
        <MasterTableView AutoGenerateColumns="False" DataSourceID="SqlDataSource1" NoDetailRecordsText="No attachments to display.">
            <DetailTables>
                <telerik:GridTableView runat="server" DataKeyNames="SessionId" DataSourceID="SqlDataSource2" AllowPaging="False" PageSize="5" NoDetailRecordsText="No attachment to display.">
                    <Columns>
                        <telerik:GridAttachmentColumn DataSourceID="SqlDataSource2" HeaderText="Download" AttachmentDataField="DocName" AttachmentKeyFields="1" FileNameTextField="DocName" DataTextField="Path" UniqueName="Attachments" MaxFileSize="1048576">
                        </telerik:GridAttachmentColumn>
                    </Columns>
                </telerik:GridTableView>
            </DetailTables>
            <CommandItemSettings ShowAddNewRecordButton="False" ShowExportToExcelButton="True" ShowExportToPdfButton="True" ShowExportToWordButton="True" ShowRefreshButton="False" />
            <Columns>
                <telerik:GridBoundColumn DataField="SessionId" FilterControlAltText="Filter SessionId column" HeaderText="SessionId" SortExpression="SessionId" UniqueName="SessionId" Visible="False">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn DataField="Ticket Number" FilterControlAltText="Filter TicketNumber column" HeaderText="Ticket Number" SortExpression="TicketNumber" UniqueName="TicketNumber">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn DataField="Title" FilterControlAltText="Filter Title column" HeaderText="Title" SortExpression="Title" UniqueName="Title">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn DataField="Description" FilterControlAltText="Filter Description column" HeaderText="Description" SortExpression="Description" UniqueName="Description" Visible="False">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn DataField="AffectedUser" FilterControlAltText="Filter AffectedUser column" HeaderText="AffectedUser" SortExpression="AffectedUser" UniqueName="AffectedUser">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn DataField="AssignedTo" FilterControlAltText="Filter AssignedTo column" HeaderText="AssignedTo" SortExpression="AssignedTo" UniqueName="AssignedTo">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn DataField="Owner" FilterControlAltText="Filter Owner column" HeaderText="Owner" SortExpression="Owner" UniqueName="Owner">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn DataField="Location" FilterControlAltText="Filter Location column" HeaderText="Location" SortExpression="Location" UniqueName="Location">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn DataField="Resolution" FilterControlAltText="Filter Resolution column" HeaderText="Resolution" SortExpression="Resolution" UniqueName="Resolution">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn DataField="Close Date" DataType="System.DateTime" FilterControlAltText="Filter CloseDate column" HeaderText="Close Date" SortExpression="CloseDate" UniqueName="CloseDate">
                </telerik:GridBoundColumn>
            </Columns>
        </MasterTableView>

<FilterMenu RenderMode="Lightweight"></FilterMenu>

<HeaderContextMenu RenderMode="Lightweight"></HeaderContextMenu>
</telerik:RadGrid>

我猜 Telerik 没有预测此控件的 UNC 路径使用情况,看来您需要添加一些斜线并正确设置格式才能使 link 完全可点击。

file://///server/path/to/file.txt

即便如此,它也可能无法完全跨浏览器兼容。从网站访问本地文件存在安全风险。

Linking a UNC / Network drive on an html page

用不同的方法解决了这个问题。

  • 更改为 HyperLinkColumn
  • 使用方法如下 DataNavigateUrlFormatString="~\filedownload_6?FileName={0}"
  • 添加了一个"Download Page"
  • 在 IIS 的网站中创建了一个虚拟目录,其中的应用 运行 指向文件 在 Server.MapPath 方法中分享和使用它。 (代码中的~/文件/)

https://support.microsoft.com/en-ca/help/308150/how-to-create-a-virtual-directory-on-an-existing-web-site-to-a-folder

文件下载页面代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DBSearchSolution
{
    public partial class filedownload_6 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //string filename = Request.QueryString["29215_1_0_image001.png"].ToString();
            string filename = Request.QueryString["FileName"].ToString();
            Response.ContentType = "application/octet-steam";
            Response.AppendHeader("content-disposition", "attachment; filename=" + filename);
            Response.TransmitFile( Server.MapPath("~/Files/" + filename));
            Response.End();
        }


    }
}