2012-01-05 1 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

+0

이 파일은 웹 사이트/응용 프로그램 폴더 아래에 있습니까? window.open()은 URL로 절대 주소를 지정할 수 있습니다. 상대적 또는 절대적입니다. 여기서 절대 값은 "HTTP", "HTTPS"등으로 시작합니다. – GalacticCowboy

+0

파일의 실제 위치는 web.config에 정의되어 있습니다. 원격 컴퓨터의 웹 사이트/응용 프로그램 폴더 아래에있을 수 있습니다.그래서 당신은 window.open()을 사용할 수 없다는 것을 의미합니다. 사용할 수있는 다른 기능이 있습니까? – GLP

답변

3

사용자의 질문은 사용자의 로컬 컴퓨터에서 파일을 열 수 있다고 생각한다는 인상을줍니다. 그렇다면 이것은 불가능합니다.

파일이 클라이언트 측이 아니라 서버 측에 있기 때문에 Window.open은 URL을 필요로합니다.

그렇다면 서버 측에있는 파일을 열려고 할 때 파일의 전체 경로를 알고 있어야합니다. 파일을 찾을 수있는 응용 프로그램 내에서 가상 경로를 생성해야합니다. 이렇게하려면 IIS Admin Manager (제어판 -> 관리 도구 -> 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)

+0

샘플 코드가 있습니까? 감사. – GLP

+0

@ GaolaiPeng : 내 편집을 확인하십시오. 보여줄 코드가별로 없습니다. 모든 작업은 APP에 대한 IIS의 가상 디렉터리를 구성합니다. – Icarus

+0

Reponse를 사용하여 파일을 보는 경우 보안 문제가 발생합니까? – GLP

1

당신은 파일의 가상 경로를 얻을 수있는 AppDomainAppVirtualPath를 사용하여 시도 할 수 있습니다.

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

파일이 가상 디렉터리 내에 있지 않으면 몇 가지 보안 문제가 있습니다. 고려하고 해결할 필요가있다. 일반적으로 가상 디렉터리 외부의 파일에 액세스하는 것은 좋지 않습니다.

필요한 경우 보안 사용 권한을 설정하고 네트워크의 파일에 대한 액세스 권한을 부여해야합니다.