我有一个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);
}
答案 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)
如果文件不在虚拟目录中,则需要考虑并解决许多安全问题。一般来说,访问虚拟目录之外的文件并不是一个好主意。
如果必须,则需要提高安全权限并授予对网络上文件的访问权限。