2014-09-15 6 views
3

다음은 CSV 파일을 만든 후 코드입니다. 아래 코드를 사용하기 위해 파일을 다운로드하고 싶습니다. "Response.AddHeader ("Content-disposition ","attachment; filename = "+ fileCSV +"\ ""); "에 서버가 HTTP 헤더를 보낸 후에 헤더를 추가 할 수 없습니다. 같은 페이지로 리디렉션하지HTTP 헤더를 보낸 후에 서버에서 헤더를 추가 할 수 없습니다.

string[] header = { "Error Occurred On", "Controller Name", "Action Name", "Exception Occurred", "Stack Trace Description", "InnerException Occurred", "Stack Trace InnerException Occurred " }; 

코드 :. 당신은 파일을 다운로드 한 후 리디렉션 할 수 없습니다

DataTable dt = new DataTable(); 
for (int e = 0; e < header.Length; e++) 
{ 
    dt.Columns.Add(header[e], typeof(string)); 
} 
StringBuilder sb = new StringBuilder(); 
IEnumerable<string> columnNames = dt.Columns.Cast<DataColumn>().Select(column => column.ColumnName); 
sb.AppendLine(string.Join(",", columnNames)); 
dt.DefaultView.RowFilter = "[Exception Occurred] LIKE '%" + keyword + "%'"; 
DataTable dtFilter = new DataTable(); 
dtFilter = dt.DefaultView.ToTable(); 
foreach (DataRow row in dtFilter.Rows) 
{ 
    IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString()); 
    sb.AppendLine(string.Join(",", fields)); 
} 
System.IO.File.WriteAllText(fileCSV, sb.ToString()); 

byte[] bytes = Encoding.ASCII.GetBytes(sb.ToString()); 
if (bytes != null) 
{ 
    Response.Clear(); 
    Response.ContentType = "text/csv"; 
    //Response.AddHeader("Content-Length", bytes.Length.ToString()); 
    Response.AddHeader("Content-disposition", "attachment; filename=" + fileCSV); 
    Response.BinaryWrite(bytes); 
    Response.Flush(); 
    Response.End(); 
} 
+2

이 코드 전에 어떤 일이 발생합니까? 그 자체의 오류는 아주 분명합니다. – CodeCaster

+0

이 전에는 데이터 테이블 작성 csv 파일을 사용합니다. datatable에서 csv로 데이터를 추가합니다. –

답변

2

을, 당신은 첫 번째를 할 수있는이 작업을 수행하려고

. 새 (팝업) 창에서 파일을 다운로드하고 m을 리디렉션하는 것이 좋습니다. 필요한 경우 ain 페이지.

편집 : -

당신은 window.open.

예를 사용하여 파일 다운로드 조치를 열어 다운로드를 강제 할 수 : - HTTP에서

<a href="Action/RedirectPage" data-file="Action/DownloadCVS" class="file-download">Download File</a> 

<script> 
    $(function() { 
     $('a.file-download').click(function() { 
     window.open($(this).data('file')); 
     }); 
    }); 
</script> 
+0

새 팝업 창에서 수행하는 방법. 몇 가지 코드 예제를 공유 할 수 있습니까? –

+0

안녕하세요,이 문제는 해결되었습니다, 그 반복 문제. 하지만 CSV 파일을 다운로드 한 후 브라우저는 페이지를로드하지 않습니다. –

1

는 각각 하나의 응답이 의뢰. 따라서이 오류는 이미 응답에 무엇인가를 보냈다는 것을 의미합니다.

+1

나는 show function 아래에서 다운로드하기 전에하고있다. 나도 알다시피 나는 다른 요청을 보내지 않을거야. DataTable dtFilter = 새 DataTable(); dtFilter = dt.DefaultView.ToTable(); foreach (dtFilter.Rows의 DataRow 행) { IEnumerable fields = row.ItemArray.Select (field => field.ToString()); sb.AppendLine (string.Join (",", fields)); } System.IO.File.WriteAllText (fileCSV, sb.ToString()); –

+0

전체 메소드 코드로 질문을 업데이트하십시오. – aleha

0

응답을 찾고 있지만 Response.Flush가 아닌 & Response.HttpContext.ApplicatiohInstance.CompleteRequest()를 사용해보십시오. 요청 스트림에 직접 쓰려고 할 때 많은 문제가 해결되었습니다.

관련 문제