如何通过其完整路径打开文件?

时间:2012-01-05 15:30:45

标签: asp.net gridview window.open

我有一个GridView,它有以下模板字段,用于保存文件名,当用户单击文件名时,我调用window.open()打开文件。我的问题是我只能将相对路径传递给window.open()。如果我使用完整路径,我会收到错误。有什么方法可以使用完整路径打开文件吗?谢谢。

<asp:TemplateField HeaderText="FileName">
                    <ItemTemplate>
                        <asp:LinkButton ID="lnkFile" runat="server"
                        Text='<%# Eval("FileName")%>' OnClick="lnkFile_Click">
                        </asp:LinkButton>
                    </ItemTemplate>
</asp:TemplateField>

补充:文件的实际位置在web.config中定义。

我写了以下lnkFile_Click()。旧部分将为该文件打开一个新窗口,但我无法传递该文件的完整路径。新部件将允许您选择打开或保存文件。我的问题是,这会导致安全问题吗?

protected void lnkFile_Click(object sender, System.EventArgs e)
{
    string fileName = ConfigurationSettings.AppSettings["SPRAttachmentLocation"] + "\\SPR" + sprID + "\\" + ((LinkButton)sender).Text;
    if (!File.Exists(fileName))
    {
        Exception ex = new Exception("Could not find the file, please contact your administrator.");
        Response.Write("<p align=\"center\"><br /><br /><br /><br />There has been an Error: <strong>" + ex.Message + "</strong></p>\n");

        return;
    }

新:

byte[] bts = System.IO.File.ReadAllBytes(fileName);
Response.Clear();
Response.ClearHeaders();
Response.AddHeader("Content-Type", "");
Response.AddHeader("Content-Length", bts.Length.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
Response.BinaryWrite(bts);
Response.Flush();
Response.End();

旧:

   string newWindowUrl = "/SPR_Upload/SPR" + sprID + "/" + ((LinkButton)sender).Text;

            string javaScript =
             "<script type='text/javascript'>\n" +
             "<!--\n" +
             "window.open('" + newWindowUrl + "');\n" +
             "// -->\n" +
             "</script>\n";

   Page.ClientScript.RegisterStartupScript(GetType(), "", javaScript);
}

3 个答案:

答案 0 :(得分:3)

您的问题给人的印象是您认为可以从用户的本地计算机打开文件。如果是这种情况,这是不可能的。

Window.open需要一个URL,因为该文件位于服务器端,而不是客户端。

话虽如此,如果您尝试打开位于服务器端的文件,并且您知道该文件的完整路径;您需要做的是在应用程序中生成可以找到文件的虚拟路径。您可以通过IIS管理管理器(控制面板 - &gt;管理工具 - > IIS管理)在APP中创建虚拟目录并将此目录映射到实际物理目录来实现此目的。

修改

例如,假设您的整个网站实际位于c:\inetpub\wwwroot\your_app上的服务器上。我们假设您的应用可以通过http://example.com访问,而您要投放的文件实际上位于d:\files。进一步假设您为应用程序创建了一个虚拟目录(如上所述)并且您调用了此虚拟文件夹public_files。如果知道文件名,则只需转到http://example.com/public_files/filename.ext就可以访问该文件。由于您在应用程序中已经知道了文件名,因此您需要将所有需要作为参数传递给window.open的是此URL(http://example.com/public_files/filename.txt

答案 1 :(得分:1)

您可以尝试使用AppDomainAppVirtualPath获取文件的虚拟路径。

string vPath = HttpRuntime.AppDomainAppVirtualPath + "/my/relative/path"

答案 2 :(得分:0)

如果文件不在虚拟目录中,则需要考虑并解决许多安全问题。一般来说,访问虚拟目录之外的文件并不是一个好主意。

如果必须,则需要提高安全权限并授予对网络上文件的访问权限。