【问题标题】:how to open a file by its full path?如何通过完整路径打开文件?
【发布时间】:2012-01-06 00:50:12
【问题描述】:

我有一个 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);
}

【问题讨论】:

  • 此文件是否位于网站/应用程序文件夹下? window.open() 只能通过 URL 寻址 - 相对或绝对,其中绝对以“HTTP”、“HTTPS”等开头。
  • 文件的实际位置在web.config中定义。它可能位于远程计算机的网站/应用程序文件夹下。所以你的意思是我不能使用window.open()。有没有其他功能可以使用?

标签: asp.net gridview window.open


【解决方案1】:

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

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

话虽如此,如果您尝试打开位于服务器端的文件并且您知道该文件的完整路径;您需要做的是在您的应用程序中生成可以找到该文件的虚拟路径。为此,您可以通过 IIS 管理管理器(控制面板-->管理工具-->IIS Mgmt)在您的 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)

【讨论】:

  • @GaolaiPeng:检查我的编辑。没有太多代码可以显示。所有的工作都是在 IIS 上为您的 APP 配置虚拟目录。
  • 如果我使用Reponse查看文件,会不会引起安全问题?
  • use Response 是什么意思?您的意思是流式传输文件吗?
  • 只要您确认用户实际上应该有权访问相关文件,就没有安全问题。请注意,您的新方法不需要您创建一个虚拟目录,正如我在回答中解释的那样。相反,使用流式传输文件的方法,您只需要确保用户无法以您的程序可以盲目地获取文件名并将其流式传输给用户的方式来操作链接,而无需确保它是为他准备的。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-02-04
      • 1970-01-01
      • 2021-07-07
      • 2010-10-24
      • 2014-06-08
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多