2011-10-11 4 views
9

별도의 파일 서버에있는 파일에 대한 다운로드 링크를 만들 수있는 방법을 찾고 있습니다.파일 서버의 파일에 대한 다운로드 링크 만들기

상황은 다음과 같습니다. 개발중인 응용 프로그램 (v2.net의 asp.net 2.0이지만 C#에서 비슷한 문제가 있음, 둘 중 하나의 솔루션이 작동 함)이 회사 내부에서 실행됩니다. 파일 저장 및 웹 응용 프로그램은 별도의 두 서버에 있습니다.

기본적으로 파일에 대한 다운로드 링크를 만들 수 있어야합니다. 파일에 액세스 할 수있는 유일한 URL은 \ servername \ folder1 \ folder2 \ folder3 \ file.txt입니다. 파일)

웹 링크는 단순히 작동하지 않습니다. 현재 설정 상태입니다.

tablerowfield.Text = String.Format(
    "<a href=""\\servername\folder1\folder2\folder3\{0}"" 
     target=""_blank"">Click me</a>", 
    filename) 

이는 명백한 이유로 작동하지 않습니다. 이전에는이 ​​파일을 응용 프로그램 경로 자체에 쓰도록 설정되어 있었지만 완벽하게 작동했지만 좋은 연습이 아니므로 그 파일을 변경 (또는 시도)합니다.

다운로드 페이지를 만드는 방법에 대한 솔루션을 읽은 다음 링크를 보유하고 다운로드 할 적절한 웹 URL을 반환하는 DB를 가지고 있지만 불행히도 제가 직면 한 시간 제약 조건을 통해 개발할 수있는 방법이 없습니다.

위의 파일에 전체 파일 경로가 포함 된 문자열을 제공한다고 가정 할 때 클릭 할 때 문서를 다운로드하는 가장 쉬운 방법은 무엇입니까?

참고 :이 환경에서는 관리자 권한이 없습니다. 그게 정말 도움이 안돼. 위와 같은 올바른 링크가 주어진 것으로 가정하고 적절한 파일 액세스 권한 등을 갖습니다.

UPDATE :

위의 예는 파이어 폭스와 크롬에서 IE에서 작동하지 않습니다,하지만. IE는 그것을 file : // servername/... 링크로 변환하지만, FF와 Chrome은 이것이 안전하지 못하고 브라우저에서 사용하지 못하도록 적극적으로 결정했습니다.

당신은 ASHX 파일 (예를 들어, downloadfile.ashx)를 사용하여 다음과 같은 코드를 사용 (안 테스트를하지만 그런 일이 될 것입니다) 거기에 있습니다

답변

16

:

Response.Clear(); 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("Content-Disposition", "attachment; filename=abc.txt");            
Response.WriteFile(Server.MapPath("\\servername\folder1\folder2\folder3\abc.txt")); 
Response.End(); 

를 다음 앵커에서 이것을 사용 태그 같은 :

<a href="downloadfile.ashx" target=""_blank"">Click me</a> 

참고 :

<a href="downloadfile.ashx?file=abc.txt" target=""_blank"">Click me</a> 

: 또한 같은 다른 파일을 다운로드하기위한 매개 변수를 전달할 수 있습니다 그런 다음 ashx 파일에서 파일 이름을 사용하여 해당 파일을 다운로드하십시오.

+0

좋아처럼 다운로드 버튼을 클릭 이벤트에서이 코드를 사용할 수 있지만, 그것은 나에게 오류를 gving 유지 Response.WriteFile. "\\ server \ folder \ file.txt"형식의 문자열을 입력하면 다음과 같이 나타납니다. '/server/folder/file.txt'경로를 매핑하지 못했습니다. 가능한 모든 파일을 시도했습니다. 이 문제와 관련하여 어떤 경험이 있으십니까? – Flater

+0

앞서 언급 한 것처럼 file = abc.txt와 같은 매개 변수를 첫 번째 링크, file = otherfile.txt 등과 같이 전달할 수 있습니다. 따라서 파일 이름을 동적으로 가져 와서 ASHX 파일로 전달하게됩니다. 클라이언트 측에 존재하지 않는 서버 경로 (LAN에 연결되어 있지 않은 경우)를 사용하는 대신 사용자가 ASHX 파일을 다운로드하도록 허용합니다. – wasimbhalli

+0

내 이전 게시물을 무시하고 서버를 삭제할 수 있습니다. .Mapath 그리고 그것을 작동 :) 아직 조금 마무리 퍼지하지만이 끔찍한 많이 도와 줬어! 감사! – Flater

0

\\servername\folder1\folder2\folder3\...은 브라우저에서 사용할 수없는 UNC 경로입니다. 파일이 별도의 서버에 있으므로 http://server-name/folder1/folder2/file.txt 형식의 href 특성이 필요합니다.http://10.1.1.30/folder1/folder2/file.txt 여기

당신이 IP 주소를 얻는 방법이다 : 서버 이름이 클라이언트에서 해석 할 수없는 경우

, 당신은 먼저 서버의 IP 주소를 얻을 다음 폼의 HREF을 수립 할 필요가 서버 이름 :

IPAddress[] host; 
host = Dns.GetHostAddresses("server-name"); 
string ip = host[0].ToString();   

편집 : 나는 기본적으로 파일에 대한 다운로드 링크를 생성 할 수 있어야합니다

ashx 솔루션을 사용하면 응용 프로그램이 서버에서 파일을 읽고 파일 서버에서 파일을 직접 다운로드하는 링크를 클라이언트에 제공하는 대신 클라이언트에 릴레이합니다.

3

이 코드 조각은 다운로드 폴더에 name = hi.txt라는 내용의 파일을 만들고 "thanks god, finally file got download"파일을 만듭니다. 파일이 서버에 이미있는 경우

Response.Clear(); 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("Content-Disposition", "attachment; filename=hi.txt"); 
Response.Write("thanks god, finally file got downloaded."); 
Response.End(); 
0

는 내가 작업 처리기를 가지고이

protected void downloadpdf_Click(object sender, EventArgs e) 
{ 
    Response.Clear(); 
    Response.ContentType = "application/octet-stream"; 
    Response.AddHeader("Content-Disposition", "attachment; filename=""downloadName.pdf"""); 
    Response.WriteFile(Server.MapPath(@"~/path of pdf/actualfile.pdf")); 
    Response.End(); 
} 
+0

올바른 답변이지만이 답변은 거의 2 년 전에 솔루션 *으로 표시된 것과 정확히 같습니다. – Flater

관련 문제