2011-10-17 3 views
1

ASP.net에 웹 응용 프로그램을 작성하고 있습니다.ASP.Net 파일 전송

서버에서 다운로드하기 위해 파일 대화 상자를 표시하려고합니다.

파일이라는 변수에 적절한 파일 데이터가 저장되어 있습니다. 파일
FilePath를의 MIME 타입 - - 서버 측 파일 경로 여기

지금까지 코드의 되는 파일 형식 :

Response.Clear(); 
Response.ContentType = file.FileType; 
Response.AppendHeader("Content-Disposition", "attachment; filename=" +  GetFileName(file)); 
Response.TransmitFile(file.FilePath) ; 
Response.End(); 

려면 getFilename 저를 유도 할 수있는 기능입니다

파일 필드가 첨부 파일 객체의 파일 이름. 나는 그 길만 저장한다.

위의 코드는 클릭하면 트리거되는 이벤트 인 "Download_Clicked"라는 함수에 있습니다. 이벤트는 LinkButton에 매핑됩니다.

위의 코드를 실행해도 아무런 문제가 발생하지 않습니다. 표준 대화 상자가 나타나지 않습니다.

파일이 있는지 확인하고 경로가 올바른지 확인하는 등의 표준 문제 해결을 시도했습니다. 그들은 둘 다 마크에서 죽었다.

내 컴퓨터는 서버이기 때문에 어떻게 든 제대로 처리되지 않을 수도 있습니다.

미리 감사드립니다.

편집 1 : 다른 페이지에 컨트롤을 넣으려고하면 정상적으로 작동합니다.

편집 2 : AJAX 업데이트 패널에서 컨트롤을 제거하여 문제가 해결되었습니다.

+0

IIS에서 MIME 유형을 알고 있습니까? "application/octet-stream"을 사용해 보셨습니까? –

+0

옥텟 스트림 MIME 형식을 시도했지만 여전히 실행되지 않습니다. – wanderingloki

+2

Ajax 업데이트 패널은 FileUpload 컨트롤이나 Response를 사용하여 파일을 다운로드 할 때 제대로 작동하지 않습니다. MSAjax 라이브러리에는 응답 스트림을 수정하면 오류가 발생하는 보안 조치가 내장되어 있습니다. 동적으로 생성 된 파일을 다운로드하는 일반적인 방법은 세션 변수에 파일 데이터를 임시 저장 한 다음 페이지로드시 해당 세션 변수를 특별히 보는 페이지로 사용자를 리디렉션하고 브라우저에 파일을 보내는 것입니다. http 핸들러를 사용하여이 작업을 수행하거나 파일 업로드/다운로드 컨트롤을 업데이트 패널 외부에 두는 것만으로도 가능합니다. –

답변

0

초기 게시물 수정을 참조하십시오.

오류를 해결하기 위해 Ajax 업데이트 패널을 제거했습니다. 패널이 게시물을 서버로 다시 보냈습니다.

자세한 내용은 Cris Valenzuela의 의견을 참조하십시오.

0

한번에 변경

Response.AppendHeader("Content-Disposition", "attachment; filename=" +  GetFileName(file)); 

문제가 해결되지 않으면

Response.AppendHeader("Content-Disposition", "attachment; filename=" +  Path.GetFileName(GetFileName(file)))); 

에, 당신은 항상 다음은 웹 브라우저 에 파일을 스트리밍 할 Response.BinaryWrite 또는 Resonse.Write을 사용할 수 있습니다 Response.Write 또는 Response.BinaryWrite를 사용하여 파일을 전송하는 방법.
public void SendFileToBrowser(String FileName, String MIMEType, String FileData) 
    { 
     Response.Clear(); 
     Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName); 
     Response.ContentType = MIMEType; 
     Response.Buffer = true; 
     Response.Write(FileData); 
     Response.End(); 
    } 

    public void SendFileToBrowser(String FileName, String MIMEType, Byte[] FileData) 
    { 
     Response.Clear(); 
     Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName); 
     Response.ContentType = MIMEType; 
     Response.Buffer = true; 
     Response.BinaryWrite(FileData); 
     Response.End(); 
    } 

을 필요에 따라 다음 어딘가에 대신 이렇게

SendFileToBrowser("FileName.txt", "text/plain", "Don't try this from an Update Panel. MSAjax does not like it when you mess with the response stream."); 
+0

죄송합니다. 문제가 해결되지 않았습니다. 아직도 아무것도 얻지 못한다. – wanderingloki

+0

Response.WriteFile을 사용하여 시도한 파일 –

0

사용 Response.WriteFile()처럼 이러한 함수를 호출 그들에게 전화 어딘가 후 도서관에서 이러한 기능을 넣습니다.

또한 Response.End()을 사용하지 마십시오! 이렇게하면 스레드가 중단됩니다. 사용 Response.Flush(); Response.Close();

+0

을 전송하기 위해 Response.Write 및 Response.BinaryWrite 메서드를 추가했습니다. 특이한 점은 내가 컨트롤을 가져 와서 다른 페이지로 던져 버렸다는 것입니다. 그러나 나는 그것을 처음 페이지에 적용하지 않을 것이다. – wanderingloki

+0

'Response.ContentType = file.FileType;'- 컨텐츠 유형은 MIME 컨텐츠 유형, * not * 파일 유형입니다. Google에 출력 할 파일과 일치하는 일반적인 콘텐츠 유형 목록을 확인할 수 있습니다. "깨진"페이지가 헤더를 보내지 않았는지 확인하십시오. 일단 헤더가 클라이언트로 보내지면 다시 보낼 수 없습니다. – Leon

+0

file.FileType은 파일의 MIME 유형입니다. 출력에만 사용됩니다. 이것은 클라이언트에게 무언가를 보내는 유일한 기능이며, 물건을 보내는 페이지에는 다른 것이 없습니다. – wanderingloki

3

업데이트 패널을 제거하지 않고도이 작업을 수행 할 수있는 다른 방법을 찾았습니다. 페이지로드시 아래 코드를 삽입하면 해당 버튼을 사용하여 다운로드를 시작할 수 있습니다.

ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(Button);