2012-01-05 90 views
1

我有一個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); 
} 
+1

你得到了什麼錯誤? – keyboardP 2012-01-05 15:35:38

+0

此文件是否位於網站/應用程序文件夾下? window.open()只能通過URL(相對或絕對)來尋址,其中絕對以「HTTP」,「HTTPS」等開頭。 – GalacticCowboy 2012-01-05 15:36:30

+0

文件的實際位置在web.config中定義。它可以在遠程機器的網站/應用程序文件夾下。所以你的意思是我不能使用window.open()。有沒有其他功能可以使用? – GLP 2012-01-05 15:43:10

回答

3

您的問題給人的印象是您認爲您可以從用戶的本地計算機打開文件。如果是這樣的話,這是不可能的。

Window.open需要一個URL,因爲該文件位於服務器端,而不是客戶端。這就是說,如果你試圖打開位於服務器端的文件,並且你知道文件的完整路徑,你需要做的是在應用程序中生成可找到文件的虛擬路徑。您可以通過在IIS管理器(控制面板 - >管理工具 - > 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

+0

是否有示例代碼?謝謝。 – GLP 2012-01-05 15:45:26

+0

@GaolaiPeng:查看我的編輯。沒有太多的代碼可以顯示。所有的工作都是爲您的APP配置IIS上的虛擬目錄。 – Icarus 2012-01-05 15:59:17

+0

如果我使用Reponse查看文件,是否會導致安全問題? – GLP 2012-01-05 16:35:44

1

你可以嘗試使用AppDomainAppVirtualPath獲取該文件的虛擬路徑。

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

如果文件不在虛擬目錄內,那麼你有很多安全問題需要考慮和解決。一般來說,訪問虛擬目錄之外的文件並不是一個好主意。

如果您必須,那麼您需要提高安全權限並授予對網絡文件的訪問權限。